const關鍵字及其作用(用法),C語言const詳解

2020-07-16 10:04:25
const 在實際程式設計中用得並不多,const 是 constant 的縮寫,意思是“恆定不變的”!它是定義唯讀變數的關鍵字,或者說 const 是定義常變數的關鍵字。

說 const 定義的是變數,但又相當於常數;說它定義的是常數,但又有變數的屬性,所以叫常變數。用 const 定義常變數的方法很簡單,就在通常定義變數時前面加 const 即可,如:
const  int  a = 10;
const 和變數型別 int 可以互換位置,二者是等價的,即上條語句等價於:
int  const  a = 10;
那麼用 const 修飾後和未修飾前有什麼區別呢?它們不都等於 10 嗎?

用 const 定義的變數的值是不允許改變的,即不允許給它重新賦值,即使是賦相同的值也不可以。所以說它定義的是唯讀變數。這也就意味著必須在定義的時候就給它賦初值。

如果定義的時候未初始化,我們知道,對於未初始化的區域性變數,程式在執行的時候會自動把一個很小的負數存放進去。這樣後面再給它賦初值的話就是“改變它的值”了,即發生語法錯誤。

用 const 修飾的變數,無論是全域性變數還是區域性變數,生存週期都是程式執行的整個過程。全域性變數的生存週期為程式執行的整個過程這個是理所當然的。而使用 const 修飾過的區域性變數就有了靜態特性,它的生存週期也是程式執行的整個過程。我們知道全域性變數是靜態的,靜態的生存週期就是程式執行的整個過程。但是用const修飾過的區域性變數只是有了靜態特性,並沒有說它變成了靜態變數。

我們知道,區域性變數儲存在棧中,靜態變數儲存在靜態儲存區中,而經過 const 修飾過的變數儲存在記憶體中的“唯讀資料段”中。唯讀資料段中存放著常數和唯讀變數等不可修改的量。

前面說過,陣列的長度不能是變數。雖然 const 定義的是唯讀變數,就相當於是定義一個常數。但是唯讀變數也是變數,所以 const 定義的變數仍然不能作為陣列的長度。但是需要注意的是,在 C++ 中可以!C++ 擴充套件了 const 的含義,在 C++ 中用 const 定義的變數也可作為陣列的長度。

const VS define

很多人在學習 const 的時候都會混淆它與 define 的區別。從功能上說它們確實很像,但它們又有明顯的不同:
  1. define是預編譯指令,而const是普通變數的定義。define定義的宏是在預處理階段展開的,而const定義的唯讀變數是在編譯執行階段使用的。
  2. const定義的是變數,而define定義的是常數。define定義的宏在編譯後就不存在了,它不佔用記憶體,因為它不是變數,系統只會給變數分配記憶體。但const定義的常變數本質上仍然是一個變數,具有變數的基本屬性,有型別、佔用儲存單元。可以說,常變數是有名字的不變數,而常數是沒有名字的。有名字就便於在程式中被參照,所以從使用的角度看,除了不能作為陣列的長度,用const定義的常變數具有宏的優點,而且使用更方便。所以程式設計時在使用const和define都可以的情況下儘量使用常變數來取代宏。
  3. const定義的是變數,而宏定義的是常數,所以const定義的物件有資料型別,而宏定義的物件沒有資料型別。所以編譯器可以對前者進行型別安全檢查,而對後者只是機械地進行字元替換,沒有型別安全檢查。這樣就很容易出問題,即“邊際問題”或者說是“括號問題”。