1. 程式人生 > >C/C++文字常量與常變數

C/C++文字常量與常變數

以下程式碼使用平臺是Windows 64bits+VS2017。

在C/C++程式設計時,經常遇到以下幾個概念:常量、文字常量、字面常量、符號常量、字元常量、常變數、字串常量等,網上的資料描述的不盡相同,弄得大家雲裡霧裡。本文將嘗試為大家捋清楚以上易混淆概念的定義、關係和區別。

常量指值不可改變的量,在C/C++中常量分為兩種,文字常量(Literal Constant)和常變數(Constant Variable)。
文字常量和常變數的本質區別:文字常量編譯之後儲存在程式碼段,不可定址,常變數儲存在資料區(堆、棧、BSS段或資料段),可定址。

1.文字常量

文字常量又稱為“字面常量”,包括數值常量

字元常量符號常量。其特點是編譯後寫在程式碼區,不可定址,不可更改,屬於指令的一部分。

int& r=5;   //編譯錯誤

這條語句出現編譯錯誤,原因是文字常量不可定址,因而無法為文字常量建立引用。下面這條語句又是合法的:

const int& r=5;

原因是編譯器將一個文字常量轉化成常變數的過程。在資料區開闢一個值為5的無名整型常變數,然後將引用r與這個整型常變數進行繫結。

數值常量:包括整型常量和實型常量。整型常量指常整數,有十進位制、八進位制、十六進位制三種表示形式。實型常量包括單精度浮點數(float)、雙精度浮點數(double)和長雙精度浮點數(long double),表示形式有科學計數法和非科學計數法。

int a=4;            //4為數值常量中的整型常量
float b=4.4;        //4.4為數值常量中單精度實型常量
double c=1.4e10;    //1.4e5表示的值為1.4×10^5,是數值常量中雙精度實型常量

字元常量:指ASCII字元,有128個,分為普通字元和轉義字元。普通字元指可直接書寫的字元,如’a’和’b’。轉義字元指不能直接書寫的特殊字元,需要使用反斜槓進行表示,比如’\t’表示水平製表符,’\v’表示垂直製表符。

符號常量:用識別符號代表一個常量,使用之前必須定義。例如巨集定義和列舉元素。

#define NUM 100 //NUM為符號常量,100為整型常量
enum Weekday{SUN, MON, TUES, WED, THU, FRI, SAT}; //SUN,MON等均為符號常量

2.常變數

常變數指定義時必須顯示初始化且值不可修改的變數。與其他變數一樣被分配空間,是可以定址的。注意,字串常量是常變數的一種,名稱為其本身,儲存在程式碼段,可定址,不可修改。

cout<<&”hello world”<<endl; //列印輸出字串常量”hello world”儲存地址

常變數在C/C++中由const關鍵字來定義,分為全域性常變數和區域性常變數。二者的區別在於:全域性常變數儲存在程式碼段的只讀記憶體區域,不可修改有作業系統來保障,區域性常變數儲存在棧區,在程式語言語義層面上由編輯器做語法檢查來保障其值不可修改,因不是放在只讀記憶體中,可以獲得區域性常變數的地址,執行時間接進行修改。參考如下程式碼:

#include <iostream>
using namespace std;

const int con1=3;
void showValue(const int& i)
{
    cout<<i<<endl;
}

int main(int argc,char* argv[])
{
    const int con2=4;
    int* ptr=NULL;
    ptr=const_cast<int*>(&con2);
    *ptr=5;
    showValue(con2);                //1,輸出5
    cout<<"con2:"<<con2<<endl;      //2,輸出4
    ptr= const_cast<int*>(&con1);
    *ptr=6;                         //3,執行時錯誤,寫入衝突
}

程式1處輸出5,表明區域性常量con2的值已經被修改,2處輸出為結果仍然為4,並不是說明常變數con2的值沒有被修改,而是因為編譯器在程式碼優化的過程中已經將con2替換成了文字常量4。程式3處,執行時出錯,表明全域性常變數儲存在只讀記憶體,無法間接改寫。

有關C/C++程式記憶體分割槽可參見部落格程式記憶體佈局

參考文獻

[1]符號常量與常變數的區別
[2]百度百科.符號常量
[3]百度百科.字元常量
[4]百度百科.常量
[5]陳剛.C++高階進階教程[M].武漢:武漢大學出版社,2008

相關推薦

C/C++文字常量變數

以下程式碼使用平臺是Windows 64bits+VS2017。 在C/C++程式設計時,經常遇到以下幾個概念:常量、文字常量、字面常量、符號常量、字元常量、常變數、字串常量等,網上的資料描述的不盡相同,弄得大家雲裡霧裡。本文將嘗試為大家捋清楚以上易混淆概

C++中字串常量字串變數

今天在敲遍歷內容為字串的棧的時候,發現在儲存出棧的字串時不需要另外開闢空間來儲存其中的內容,可以直接使用指標指向字串的儲存地址。 剛開始我認為字串常量在使用指標來給其他的字串變數賦值時,原來的字串在改變時,會導致指向該地址的字串變數也改變。 但是一個很重要的概念就是 字串

C語言(常量變數

C語言學習(常量與變數) 常量:固定不變的資料。 常量分為整型常量、實型常量、字元常量、字串常量。 變數:有名字的具有特定屬性的儲存單元,用來存放資料或變數的值,可以隨時改變。定義變數時,編譯器自動根據型別分配對應空間大小,該變數起始位置就是該變數的儲存位置。資料型別

CC++中經const修飾的常量變數和普通變數的區別

1.在C89標準下的const const 修飾的型別是一個常變數,不能作為陣列的下標。常變數不能作為左值。 如: const int a = 10; int b = a; //其編譯的過程和一般變數編譯的過程相同 //並不會把引用符號的地方替換為對應的資

c++中的常量物件,引用,指標

   所謂常量是指在程式執行中值始終不可改變的量。而常物件是指他的資料成員在物件的整個生存週期內不能改變。這也意味著不能用常物件去呼叫普通的成員函式,因為有可能會改變常物件的資料成員,所以便有了常成員函式。如果一個物件被宣告為常物件,他只能呼叫常成員函式。普通物件也能呼叫常成員函式

C#RichTextBox 文字查詢替換

〖歡迎轉載〗轉載請註明出處 把 查詢,替換,全部替換 三個button 的 Enabled 設定為 false ,f替換內容TextBox   Enabled 也設定為false , CheckBox2 為選中.... 在主窗體中 關聯一個函式就可以了,主窗體關聯如下:

C++全域性作用域全域性變數(V2.0)

在所有大括號之外的宣告和定義就屬於全域性作用域。 在全域性作用域中定義的變數是全域性變數。 變數的宣告使用extern 引用其他檔案中定義的全域性變數需要宣告:extern T vari_name;之後再使用。 全域性變數由於要被多個檔案同時使用,所以必須只有一個定義,其餘

C++基礎知識—常量成員函式

1.常量:程式執行的整個過程中,其值始終不可改變的量,const int a = 100;同int const a = 100。 2.指向常量的指標:const char  *c = "abc";  

c++中列舉常量巨集常量的一點區別

#include <iostream> using namespace std; class A {  enum { APPLE = 111 };   #define PEAR 333 p

2018-5-25字串常量字串變數

/*本質上我是不想搞清楚這些奇奇怪怪的東西的,都是奇奇怪怪東西 0-0 -__-*/ 下面是來自各個地方關於這個解釋,大家瞅著那個看上去比較合理就接受那一個吧,突然感覺陣列和指標是不一樣的。 char *s1="helloworld"; char s2[]="hello

字串常量字串變數

定義:在一個雙引號“ ”內的字元序列或者轉義字元序列稱為字串常量 例如:“HI HI!”  “a”  “\n\t” 這些字串常量是不能改變的,如果試圖改變指標所指向的內容是錯誤的 因為字串常

小朋友學C語言(15):“變數==常量常量==變數”的區別

(一)編寫程式 #include <stdio.h> int main() { int x = 10; if(x == 10) { printf("x equals 10\n"); }

C++之物件、成員變數成員函式詳解

一、常物件說明:常物件是指物件的資料成員的值在物件被呼叫時不能被改變。常物件必須進行初始化,且能被更新。不能通過常物件呼叫普通成員函式,但是可以通過普通物件呼叫常成員函式。常物件只能呼叫常成員函式

C/C++】符號常量 變數

1.常量 在程式執行過程中,其值不能被改變的量叫做常量。 常用的常量有如下幾類: 整型常量 實型常量 字元常量        普通字元        轉義字元 如:\\表示一個反斜線;\n表示換行,將當前位置移到下一行的開頭;\r表示回車,將當前位置移到本行的開

c語言—棧區,堆區,全局區,文字常量區,程序代碼區 詳解

註意 進制 但是 ack int 運行時 內存區域 否則 數組 轉:http://www.cnblogs.com/xiaowenhui/p/4669684.html 一、預備知識—程序的內存分配 一個由C/C++編譯的程序占用的內存分為以下幾個部分1、棧區(stack)—

17、C#中的常量和結構的定義使用

c3在C#裏面,常量指的是固定不變的量。這個常量可以是數值型、文本型或布爾型。例如: //定義常量 const int AGE=16; const string NAME="小紅"; const bool FLAG=true;

C語言常量變量的應用

其中 dot 任務 數值計算 計算 繪圖 承載 urn 字符 程序的世界中,可以讓計算機按照指令做很多事情,如進行數值計算、圖像顯示、語音對話、視頻播放、天文計算、發送郵件、遊戲繪圖以及任何我們可以想象到的事情。要完成這些任務,程序需要使用數據,即承載信息的數字與字符。 在

C/C++ 列舉型變數(enum)布林型變數(bool)

★C語言常見的資料型別有:     整型     浮點型     字元型     陣列     結構體     指標 ★這裡就來介紹列舉型(enum

C++】CC++中 const常量 - 修改時報錯

#include <stdio.h> #define PAUSE printf("Press Enter key to continue - By WangLei ..."); fgetc(stdin); int main() { const int n = 10; // &

c++ 類靜態變數變數Mark

1.靜態變數必須類外初始化 ,且只能在實現檔案中 不能在標頭檔案中 2.常靜態變數 int型別和列舉型別 可以直接在宣告時候直接初始化,其他型別必須在類外初始化 3.非靜態常變數必須在建構函式的初始化列表初始化 #include<iostream> using name