關於const 及與define的區別

2021-07-02 20:16:41 字數 1832 閱讀 6161

const是constant的縮寫,是亙古不變的意思,也翻譯為常數,常量等。認為被const修飾的詞是常量的認識是不正確的,精確的說是唯讀變數,其值在編譯時是不能被使用的。

const是關鍵字而define不是。。。

const與define的用法及區別

其區別舉個例子說明吧。。。

如果是#define aaa 3+5

那麼表示式2*aaa*3就相當於2*3+5*3,結果是6+15=21

如果是const int aaa = 3+5

那麼表示式2*aaa*3就相當於2*8*3,結果是48

const變數&常量。。。

為什麼我象下面的例子一樣用乙個const變數來初始化陣列,ansi c的編譯器會報告乙個錯誤呢?

const int n = 5;

int a[n];

答案與分析:

1)、這個問題討論的是「常量」與「唯讀變數」的區別。常量肯定是唯讀的,例如5, 「abc」,等,肯定是唯讀的,因為程式中根本沒有地方存放它的值,當然也就不能夠去修改它。而「唯讀變數」則是在記憶體中開闢乙個地方來存放它的值,只不過這個值由編譯器限定不允許被修改。c語言關鍵字const就是用來限定乙個變數不允許被改變的修飾符(qualifier)。上述**中變數n被修飾為唯讀變數,可惜再怎麼修飾也不是常量。而ansi c規定陣列定義時維度必須是「常量」,「唯讀變數」也是不可以的。

2)、注意:在ansi c中,這種寫法是錯誤的,因為陣列的大小應該是個常量,而const int n,n只是乙個變數(常量 != 不可變的變數,但在標準c++中,這樣定義的是乙個常量,這種寫法是對的),實際上,根據編譯過程及記憶體分配來看,這種用法本來就應該是合理的,只是ansi c對陣列的規定限制了它。

3)、那麼,在ansi c 語言中用什麼來定義常量呢?答案是enum型別和#define巨集,這兩個都可以用來定義常量。

問題:const變數 & const 限定的內容

下面的**編譯器會報乙個錯誤,請問,哪乙個語句是錯誤的呢?

typedef char * pstr;

char string[4] = "abc";

const char *p1 = string;

const pstr p2 = string;

p1++;

p2++;

答案與分析:

問題出在p2++上。

1)、const使用的基本形式: const char m;

限定m不可變。

2)、替換1式中的m, const char *pm;

限定*pm不可變,當然pm是可變的,因此問題中p1++是對的。

3)、替換1式char, const newtype m;

限定m不可變,問題中的charptr就是一種新型別,因此問題中p2不可變,p2++是錯誤的。

問題:const變數 & 字串常量

請問下面的**有什麼問題?

char *p = "i'm hungry!";

p[0]= 'i';

答案與分析:

上面的**可能會造成記憶體的非法寫操作。分析如下, 「i'm hungry」實質上是字串常量,而常量往往被編譯器放在唯讀的記憶體區,不可寫。p初始指向這個唯讀的記憶體區,而p[0] = 'i'則企圖去寫這個地方,編譯器當然不會答應。

問題:const變數 & 字串常量2

請問char a[3] = "abc" 合法嗎?使用它有什麼隱患?

答案與分析:

在標準c中這是合法的,但是它的生存環境非常狹小;它定義乙個大小為3的陣列,初始化為「abc」,,注意,它沒有通常的字串終止符'

define與const的區別

define 定義的其實是乙個字面常量的名字,在程式中可以把這個名字等價於字面常量使用,在編譯時會被編譯器替換為該字面常量。使用這種方式,只能達到提高程式可讀性的效果,但是安全性不能得到保證。從const 語句的語法格式可以看出,const 語句支援為常量指定型別,編譯器在編譯 時將其型別進行安全檢...

const 與 define的區別

在c程式中,const的用法主要有定義常量 修飾函式引數 修飾函式返回值等3個用處 在c 程式中,它還可以修飾函式的定義體,定義類中某個成員函式為恆態函式,即不改變類中的資料成員 1 const 有資料型別,而巨集沒有資料型別,編譯器可以對前者進行型別安全檢查,而對後者只進行字元替換,沒有型別安全檢...

const常量與 define巨集

define 巨集定義語句 在預處理階段直接做文字替換,不做型別檢查。const c 1 處理時間不同 define所定義的巨集變數在預編譯 預處理 的時候進行替換,const 變數在編譯時確定其值。2 對於 const 變數,系統只在其定義時分配一段記憶體空間,而 define 則是給出了乙個立即...