1. 程式人生 > >第3課 - 進化後的const分析

第3課 - 進化後的const分析

wid 修飾 hide 內部 地址 取地址 對比 display str

第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>
 2
3 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 15
printf("*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
C/C++中的const

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分析