常量的兩種定義方式比較
符號常量 #define Pi 3.1415926f;
常值變數 const float pi 3.1415926f;
第一種方式:巨集定義,是將Pi定義成一種符號,此時Pi只是3.1415926的別名,在編譯期間用3.1415926去取代Pi的值。
1.define是巨集定義,程式在預處理階段將用define定義的內容進行了替換。因此程式執行時,常量表中並沒有用define定義的常量,系統不為它分配記憶體。const定義的常量,在程式執行時在常量表中,系統為它分配記憶體。
2.define定義的常量,預處理時只是直接進行了替換。所以編譯時不能進行資料型別檢驗。const定義的常量,在編譯時進行嚴格的型別檢驗,可以避免出錯。
3.define定義表示式時要注意“邊緣效應”,例如如下定義: #define N 2+3 //我們預想的N值是5,我們這樣使用N,int a = N/2; //我們預想的a的值是2.5,可實際上a的值是3.5原因在於在預處理階段,編譯器將 a = N/2處理成了 a = 2+3/2;這就是巨集定義的字串替換的“邊緣效應”因此要如下定義:#define N (2+3)。
第二種方式:是將PI定義成變數,但告訴編譯器它的值是固定不變的,如果在程式中試圖去修改它的值,在編譯時會報錯。
const定義的常量叫做常變數原因有二:const定義常量像變數一樣檢查型別;const可以在任何地方定義常量,編譯器對它的處理過程與變數相似,只是分配記憶體的地方不同。
總結起來說,推薦用const ,而不是#define 預處理指令(但是目前看到的是使用#define的較多,難道是方便?有待考量)
1. const 可以定義資料型別,提高了型別安全性。例如,我們上面可以指定PI 這個常量是double 型別
2. const 既然是變數(這裡有點彆扭,它其實是不變的,但名稱叫做常值變數), 那麼就有地址,適用面更加廣
3. 語法上也更好理解一些
如果有提出問題的或者明確瞭解的請留言,謝謝!
參考:https://wenku.baidu.com/view/c0244d44777f5acfa1c7aa00b52acfc789eb9f6c.html