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