天天看點

簡述const的作用,const與#define相比,有何優點?const與#define的差別?

const是一個C語言的關鍵字,限定一個變量不允許被改變,産生靜态作用。在一定程度上可以提高程式的安全性和可靠性。const修飾的類型是常類型,常類型的變量或對象的值是不能被更新的。

一. 主要作用:

(1)定義const常量,常量不可變。例如const int i = 100;任何對i的變值操作都會報錯,如i++報錯。

(2)便于進行類型檢查,使編譯器對處理内容有更多的了解,消除一些隐患。比如定義一個函數,函數的參數傳const類型,那麼編譯器就會知道該參數是一個常量,不可修改。

(3)同宏定義,可以友善的進行參數的調整和修改。例如(1)中的i,如果想把i的值改為200,那麼隻需修改為const int i = 200;并且代碼中所有引用的i的值,均變為200;

(4)可以保護被修飾的東西,防止被意外修改,增強程式的健壯性。例如:

void fun(const int i)
{
	i++;//報錯
}
           

上述情況,在函數體内隻能引用i的值,比如輸出,但不能修改i的值。

(5)可以節省空間,避免不必要的記憶體配置設定。

#define PI 3.14159 //常量宏 
const double Pi=3.14159; //此時并未将Pi放入ROM中 ...... 
double i=Pi; //此時為Pi配置設定記憶體,以後不再配置設定! 
double I=PI; //編譯期間進行宏替換,配置設定記憶體 
double j=Pi; //沒有記憶體配置設定 
double J=PI; //再進行宏替換,又一次配置設定記憶體! 
           

當第一次定義變量,并用const類型的變量Pi對其指派時,系統會為Pi配置設定記憶體,以後第二次定義變量并再次被Pi指派時,系統不再配置設定記憶體。從彙編角度看,隻是給出了const變量的位址,是以當多次被引用時,類似取位址拿到裡面的值,是以隻有一份拷貝,誰想用,直接通路位址即可。

(6)提高效率

編譯器通常不為普通const常量配置設定存儲空間,而是将它們儲存在符号表中,這使得它成為一個編譯期間的常量,沒有了存儲與讀記憶體的操作,使得它的效率也很高。

在const定義指針的時候,初始化時盡量說明指針的指向,避免出現野指針。

二. const與#define相比,有何優點?

(1)const常量有資料類型,而宏常量沒有資料類型,編譯器可以對前者進行類型安全檢查,而後者隻進行字元替換,沒有類型安全檢查,并且在字元替換可能會産生意料不到的錯誤。

(2)有些內建化的調試工具可以對const常量進行測試,但不能對宏常量進行測試。

三. const與#define的差別?

(一)相同點:

兩者都可以用來定義常量。

(二)不同點:

(1). 時期:#define是在編譯的預處理階段展開,而const是在 編譯、運作的時候起作用

(2). #define隻是簡單的字元串替換,沒有類型檢查。而const有對應的資料類型,是要進行判斷的,可以避免一些低級的錯誤

(3). 就存儲方式而言:define宏在定義時不會配置設定記憶體,#define隻是進行展開,有多少地方使用,就替換多少次,它定義的宏常量在記憶體中有若幹個備份;const常量在定義時會在記憶體中配置設定(可以是堆中也可以是棧中),const定義的隻讀變量在程式運作過程中隻有一份備份。