第3課 - 進化後的const分析
第3課 - 進化後的const分析
1. C語言中的const
(1)const 修飾的變量具有只讀屬性,本質還是變量,只是告訴編譯器該變量不能出現在賦值符號的左邊。
(2)const 修飾的局部變量在棧上分配空間,修飾的全局變量在只讀存儲區分配空間。
(3)const 只在編譯期間有用,在運行期間無用。const 不能定義真正意義上的常量(const英文含義)!
(4)C語言中的常量只有枚舉這一種類型。
2. C++中的const
C++ 在 C 的基礎上對 const 進行了進化處理。
(1)當編譯器碰見 const 聲明時在符號表中放入常量。
(2)編譯過程中若發現使用常量則直接以符號表中的值替換
何為符號表?符號表是編譯器在編譯程序時產生的一張表格,其本質是編譯器在編譯程序時產生的一種數據結構。
(3)編譯過程中若發現下述情況則給對應的常量分配存儲空間。
① 對 const 常量使用了 extern 關鍵字
② 對 const 常量使用 & 操作符
Note1:C++編譯器雖然可能為 const 常量分配內存空間,但不會使用其存儲空間中的值,這樣做只是為了兼容C語言。
Note2:何為兼容? C++完全兼容C指的是,用C編譯器能編譯通過的C程序,使用C++編譯器也可以成功編譯,但是執行結果不一定相同。
1 #include <stdio.h> 2C/C++中的const3 int main() 4 { 5 const int c = 0; //C語言中會為變量c分配內存 6 int* p = (int *)&c; //C++中遇到&才為c分配內存 7 8 printf("Begin...\n"); 9 10 *p = 5; 11 12 printf("c = %d\n", c); // C語言會輸出內存中的5 13 // C++中會從符號表(而不是內存)中取值,所以為0 14 15printf("*p = %d\n", *p); 16 17 printf("End...\n"); 18 19 return 0; 20 } 21 22 // 在C中的輸出結果: c = 5 , *p = 5 23 // 在C++中的輸出結果:c = 0 , *p = 5
3. 對比C/C++中的const
本質 | 分配內存 | |
C | 只讀變量 |
局部變量分配在棧上;全局變量分配在只讀存儲區 |
C++ | 常量 |
當使用 & 操作符對const常量取地址時會分配內存空間; 當const修飾全局變量,並且在其它文件中使用extern引用時會分配內存空間 |
4. C++中的const與宏的區別
定義 | 處理方式 | |
C++中的const | const int c = 5; | 由編譯器處理,編譯器會進行類型檢查和作用域檢查 |
宏 | # define c 5 | 由預處理器處理,只是簡單的文本替換 |
1 #include <stdio.h> 2 3 void f() 4 { 5 #define a 3 // 宏沒有作用域的概念 6 const int b = 4; // const有作用域的概念,只在f()內部有效,g()不能引用 7 } 8 9 void g() 10 { 11 printf("a = %d\n", a); 12 printf("b = %d\n", b); // 這裏會發生錯誤 13 } 14 15 int main() 16 { 17 const int A = 1; 18 const int B = 2; 19 int array[A + B] = {0}; // 在C中編譯該句代碼時,由於 A+B 兩個變量的和只能在運行時確定,因此會報錯 20 // C++可以從符號表中取得A + B的值為3 21 int i = 0; 22 23 for(i=0; i<(A + B); i++) 24 { 25 printf("array[%d] = %d\n", i, array[i]); 26 } 27 28 f(); 29 g(); 30 31 return 0; 32 }C++中的const與宏
5. 小結
(1)與C語言不同,C++中的const不是只讀變量
(2)C++中的const是一個真正意義上的常量
(3)C++編譯器可能會為const常量分配空間
(4)C++完全兼容C語言中的const常量的語法特性
第3課 - 進化後的const分析