一、C語言中的const
- const修飾的變量是隻讀的,本質還是變量;
- const修飾的局部變量在棧上分配空間;
- const修飾的全局變量在只讀存儲區分配空間;
- const只在編譯期有用,在運行期無用;
- const修飾的變量不是真的常量,它只是告訴編譯器該變量不能出現在賦值符號的左邊;例如可以通過指針修改該變量的值。
- const將具有全局生命週期的變量存儲於只讀存儲區。const不能定義真正意義上的常量。
- c語言的常量只有用enum定義的。
下面兩圖就很好的展示了上面幾點:圖1是代碼,圖2是圖1的執行結果。
圖1
圖2
二、C++中的const
- 當const聲明變量時,將會在符號表中放入常量的值;
- 編譯過程中若發現使用常量時,則直接用符號表中的值替換;
- 編譯過程中若發現下述情況則會給對應的常量分配存儲空間;
對const常量使用了extern;
對const常量使用&操作符;
4.C++編譯器雖然可能爲const常量分配空間,但不會使用該空間中的值。如下圖所示:
圖3
從圖3中可看出在編譯時,會把c的值0存入符號表,在後面打印c的值就用符號表中的值替換c。
三、C++中的const與宏
- C++中的const常量類似於宏定義;
例如const int c=5;類似於#define c 5;
- const常量是由編譯器處理的,編譯器對const常量進行了類型檢查和作用域檢查;
- 宏定義則由預處理處理,單純的文本替換。
下圖將會解釋以上幾點
圖4
圖4的代碼若用C語言編譯器將會報錯,因爲19行中的A和B是變量不是確定的值,所以報錯。如圖5所示:
圖5
圖4的代碼若用C++語言編譯器則運行正常,因爲A和B是常量了,而g()函數中a則用在f()中的宏定義替換。如圖6所示;如果g()中的第12行去掉註釋則編譯就會報錯,因爲f()中的const int a =4;只在f()中起作用。如圖7所示。
圖6
圖7