error:關於const變量來初始化數組

爲什麼下面的例子在使用一個const變量來初始化數組,ANSI C的編譯器會報告一個錯誤呢?
const int n = 5;
int a[n];
答案與分析:
1)這個問題討論的是“常量”與“只讀變量”的區別。常量,例如5, "abc",等,肯定是隻讀的,因爲常量是被編譯器放在內存中的只讀區域,當然也就不能夠去修改它。而“只讀變量”則是在內存中開闢一個地方來存放它的值,只不過這個值由編譯器限定不允許被修改。C語言關鍵字const就是用來限定一個變量不允許被改變的修飾符(Qualifier)。上述代碼中變量n被修飾爲只讀變量,可惜再怎麼修飾也不是常量。而ANSI C規定數組定義時長度必須是“常量”,“只讀變量”也是不可以的,“常量”不等於“不可變的變量”。但是在C++中,局部數組是可以使用變量作爲其長度的。
2)但是在標準C++中,這樣定義的是一個常量,這種寫法是對的。實際上,根據編譯過程及內存分配來看,這種用法本來就應該是合理的,只是ANSI C對數組的規定限制了它(實際上用GCC或VS2005編譯以上代碼,確實沒有錯誤產生,也沒有給出警告)。

3)那麼,在ANSI C中用什麼來定義常量呢?答案是enum類型和#define宏,這兩個都可以用來定義常量。


const用法:

(1)可以定義const常量,具有不可變性。
  例如:const int Max=100; Max++會產生錯誤;
  (2)便於進行類型檢查,使編譯器對處理內容有更多瞭解,消除了一些隱患。
  例如: void f(const int i) { .........} 編譯器就會知道i是一個常量,不允許修改;
  (3)可以避免意義模糊的數字出現,同樣可以很方便地進行參數的調整和修改。 同宏定義一樣,可以做到不變則已,一變都變!
  如(1)中,如果想修改Max的內容,只需要:const int Max=you want;即可!
  (4)可以保護被修飾的東西,防止意外的修改,增強程序的健壯性。 還是上面的例子,如果在函數體內修改了i,編譯器就會報錯;
  例如: void f(const int i) { i=10;//error! }
  (5) 可以節省空間,避免不必要的內存分配。 例如:
  #define PI 3.14159 //常量宏
  const double Pi=3.14159; //此時並未將Pi放入RAM中 ......
  double i=Pi; //此時爲Pi分配內存,以後不再分配!
  double I=PI; //編譯期間進行宏替換,分配內存
  double j=Pi; //沒有內存分配
  double J=PI; //再進行宏替換,又一次分配內存!
  const定義常量從彙編的角度來看,只是給出了對應的內存地址,而不是像#define一樣給出的是立即數,所以,const定義的常量在程序運行過程中只有一份拷貝,而#define定義的常量在內存中有若干份拷貝。
  (6) 提高了效率。
  編譯器通常不爲普通const常量分配存儲空間,而是將它們保存在符號表中,這使得它成爲一個編譯期間的常量,沒有了存儲與讀內存的操作,使得它的效率也很高。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章