(1)const修飾的變數具有唯讀屬性,本質還是變數,只是告訴編譯器該變數不能出現在賦值符號的左邊。
(2)const 修飾的區域性變數在棧上分配空間,修飾的全域性變數在唯讀儲存區分配空間。
(3)const 只在編譯期間有用,在執行期間無用。const 不能定義真正意義上的常量(const英文含義)!
(4)c 語言中的常量只有列舉這一種型別。
1 #include 2const修飾區域性變數3int main(void)4
1 #include 2const修飾的全域性變數3const
int i = 10;4
5int main(void)6
1516
/***
17程式會發生段錯誤,const修飾的全域性變數放在唯讀儲存區,不能通過指標進行修改
18**
*/
c++ 在 c 的基礎上對 const 進行了進化處理。
(1)當編譯器碰見const宣告時在符號表中放入常量。
(2)編譯過程中若發現使用常量則直接以符號表中的值替換。
何為符號表?符號表是編譯器在編譯程式時產生的一張**,其本質是編譯器在編譯程式時產生的一種資料結構。
(3)編譯過程中若發現下述情況則給對應的常量分配儲存空間。
① 對 const 常量使用了extern關鍵字
② 對 const 常量使用&操作符
note1:c++ 編譯器雖然可能為const 常量分配記憶體空間,但不會使用其儲存空間中的值,這樣做只是為了相容 c 語言。
note2:
何為相容?c++ 完全相容 c 指的是,用c編譯器能編譯通過的 c 程式,使用 c++ 編譯器也可以成功編譯,但是執行結果不一定相同。
1 #include 2c/c++中的const3int
main()421
22//
在c中的輸出結果: c = 5 , *p = 5
23//
在c++中的輸出結果:c = 0 , *p = 5
本質分配記憶體
c唯讀變數
區域性變數分配在棧上;全域性變數分配在唯讀儲存區
c++常量
當使用 & 操作符對 const 常量取位址時會分配記憶體空間;
當 const 修飾全域性變數,並且在其它檔案中使用 extern 引用時會分配記憶體空間
定義處理方式
c++ 中的 constconst int c = 5;
由編譯器處理,編譯器會進行型別檢查和作用域檢查
巨集# define c 5
由預處理器處理,只是簡單的文字替換
1 #include 2c++中的const與巨集3void
f()489
void
g()10
1415
intmain()
16; //
在c中編譯該句**時,由於 a+b 兩個變數的和只能在執行時確定,因此會報錯
20//
c++可以從符號表中取得a + b的值為3
21int i = 0;22
23for(i=0; i
2427
28f();
29g();
3031
return0;
32 }
(1)與 c 語言不同,c++ 中的const 不是唯讀變數
(2)c++ 中的const是乙個真正意義上的常量
(3)c++ 編譯器可能會為const常量分配空間
(4)c++完全相容c 語言中的const常量的語法特性
注:本文總結於狄泰唐老師的《c++深度解析》課程
狄泰qq群:199546072
本人qq號:502218614
第3課 進化後的const分析
本文內容取自於對狄泰學院 唐佐林老師 c 深度解析 課程的學習總結 const修改的變數是唯讀的,本質還是變數const修改的區域性變數在棧上分配空間 const修改的全域性變數在唯讀儲存區分配空間 const只在編譯期有用,在執行期無用 const 修飾的變數不是真的常量,它只是告訴 編譯器該變數...
進化後的const分析
一 c語言中的const 1.const修飾的變數是唯讀的,本質上還是變數 2.const修飾的區域性變數在棧上分配空間 3.const修飾的全域性變數在唯讀儲存區分配空間 4.const只在編譯期有用,在執行期無用 const修飾的變數不是 真正的常量,它只是告訴編譯器該變數不能出現在賦值符號的左...
C 進化後的const分析
事物的難度遠遠低於對事物的恐懼!對於const關鍵字,在c高階分析中,我們知道,const在c語言中有如下特性 const修飾的變數是唯讀的,其本質還是變數而,也就是唯讀變數 依舊可以通過別的手段修改const變數 const修飾的區域性變數在棧上分配空間 const修飾的全域性變數或靜態區域性變數...