c語言中的const修飾的變數是唯讀的,本質還是變數,也就是說可以用指標修改該變數的值,並不是真正意義上的常量,它只是告訴編譯器該變數不能出現在賦值號的左邊, 修飾區域性變數時在棧上分配空間,修飾全域性變數在唯讀儲存區分配空間,且該const只在編譯時有效,在執行期無效。
(1).c++語言中const修飾的是真正意義上的常量,碰見const宣告時在符號表中放入常量,編譯時若使用常量則會直接用符號表中的值替換。
(2).編譯時若發現這兩種情況則會給對應的常量分配儲存空間:
①對全域性const常量使用了extern,需要在其他檔案中使用時
②當時用&操作符對const常量取位址時。
注意:c++中的const修飾對應的常量是相容c語言中修飾的變數,但是c++中指標永遠不會使用該常量,使用的是為該常量分配的空間(看後面原始碼剖析)
(3).c++中的const常量類似巨集定義#define:
//const常量是被編譯器處理,編譯器會對該常量進行型別和作用域的檢查
const int c = 5;
//巨集定義是被預處理器處理的,使用該常量時只是在字面層面單純的文字替換,沒有型別和作用域
#define c 5
例項剖析:
(1)原始碼:
對於const的變化:
const int c = 0;
int *p = (int *)&c;
*p = 5;
printf("c = %d\n", c);
printf("*p = %d\n", *p);
c語言認為:
c++認為:
說明:c語言中const修飾的變數是可以用指標修改它的值的,本質還是使用變數本身;c++中const為真正意義上的常量,指標使用的是它的儲存空間,並不是對應常量本身
(2)原始碼:
說明:c認為該陣列空間大小是乙個變數,所以會報錯
說明:c++認為該陣列空間大小是2個常量的和,還是乙個常量,語法正確,並且能夠編譯執行。注意fun()函式中的巨集定義a能夠在gun()中輸出,說明了巨集定義是全域性的。
const常量與巨集定義區別
1 編譯器處理方式不同 define巨集是在預處理階段展開。const常量是編譯執行階段使用。2 型別和安全檢查不同 define巨集沒有型別,不做任何型別檢查,僅僅是展開。const常量有具體的型別,在編譯階段會執行型別檢查。3 儲存方式不同 define巨集僅僅是展開,有多少地方使用,就展開多少...
const常量與巨集定義區別
1 編譯器處理方式不同 define巨集是在預處理階段展開。const常量是編譯執行階段使用。2 型別和安全檢查不同 define巨集沒有型別,不做任何型別檢查,僅僅是展開。const常量有具體的型別,在編譯階段會執行型別檢查。3 儲存方式不同 define巨集僅僅是展開,有多少地方使用,就展開多少...
const定義常量與巨集定義的區別!!!
巨集定義語法格式 define 巨集名稱 巨集值 不加分號,變數名一般設為大寫 巨集的替換與計算 舉乙個例子 define n 3 1 define y n n 1 n 若執行語句 z 2 n y 5 1 後 z 的值為多少?z 2 3 1 3 1 1 5 1 60 巨集的替換在 執行的預編譯階段,...