第3課-進化後的const分析

一、C語言中的const

  1. const修飾的變量是隻讀的,本質還是變量;
  2. const修飾的局部變量在棧上分配空間;
  3. const修飾的全局變量在只讀存儲區分配空間;
  4. const只在編譯期有用,在運行期無用;
  5. const修飾的變量不是真的常量,它只是告訴編譯器該變量不能出現在賦值符號的左邊;例如可以通過指針修改該變量的值。
  6. const將具有全局生命週期的變量存儲於只讀存儲區。const不能定義真正意義上的常量。
  7. c語言的常量只有用enum定義的。

下面兩圖就很好的展示了上面幾點:圖1是代碼,圖2是圖1的執行結果。

圖1

圖2

二、C++中的const

  1. 當const聲明變量時,將會在符號表中放入常量的值;
  2. 編譯過程中若發現使用常量時,則直接用符號表中的值替換;
  3. 編譯過程中若發現下述情況則會給對應的常量分配存儲空間;

                       對const常量使用了extern;

                       對const常量使用&操作符;

    4.C++編譯器雖然可能爲const常量分配空間,但不會使用該空間中的值。如下圖所示:

圖3

從圖3中可看出在編譯時,會把c的值0存入符號表,在後面打印c的值就用符號表中的值替換c。

三、C++中的const與宏

  1. C++中的const常量類似於宏定義;

       例如const int c=5;類似於#define c 5;

  1. const常量是由編譯器處理的,編譯器對const常量進行了類型檢查和作用域檢查;
  2. 宏定義則由預處理處理,單純的文本替換。

     下圖將會解釋以上幾點

圖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

 

發佈了16 篇原創文章 · 獲贊 3 · 訪問量 4575
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章