error 關於const變數來初始化陣列

2021-07-06 00:26:57 字數 1500 閱讀 4699

為什麼下面的例子在使用乙個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)

(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常量分配儲存空間,而是將它們儲存在符號表中,這使得它成為乙個編譯期間的常量,沒有了儲存與讀記憶體的操作,使得它的效率也很高。

const 成員變數

class mytestclass public const int m ciint const string m csstr static int m siint static string m ssstr const static int m csiint const static string...

const成員變數

const成員變數 舉個例子 include using namespace std classa private const intsize int main 說明 但是 此時的const變數屬於具體的乙個物件,如何在整個類中都恆定不變呢?答案是利用列舉,舉例 include using name...

修改const變數

宣告 不同於c語言的const變數修改問題 可以通過指標間接修改const變數的值 這裡只討論c 裡的const。c const 修飾符,表示常量,即如果以後保證不會修改則宣告為const,否則若要修改,那一開始為什麼還要宣告為const呢?根據c 標準,對於修改const變數,屬於 未定義行為 指...