宏定義常量與const定義常量的區別

心得:

這兩種方式在語法上都是合法的,但是第二種方式要比第一種方式好,因爲如果使用#define定義宏,PI會在代碼的預編譯階段被預編譯處理器替換成3.14159,宏的名稱不會出現在符號表中,這樣會給代碼後期的調試帶來麻煩,可能會遇到一個數字,卻不知道它從何而來,這就是我們常說的Magic Number(像擁有魔力一樣不知從何而來的數)。使用const定義,既可以保證PI值的唯一性,又便於調試,同時還可以對數據類型進行檢查,藉助編譯器來減少錯誤的發生。所以,我們總是優先使用const關鍵字來定義常量。


用宏表示常數

假如我們要寫一個有關圓的種種計算的程序,那麼∏(3.14159)值會被瀕繁用到。我們顯然沒有理由去改∏的值,所以應該將它當成一個常量對待,那麼,我們是否就不得不一遍一遍地寫3.14159這一長串的數呢?

必須有個偷懶的方法,並且要提倡這個偷懶,因爲多次寫3.14159,難免哪次就寫錯了。

這就用到了宏。宏不僅可以用來代替常數值,還可以用來代替表達式,甚至是代碼段。(宏的功能很強大,但也容易出錯,所以其利弊大小頗有爭議。)今天我們只談其中代替常數值的功能。

宏的語法爲:

 

#define 宏名稱 宏值

 

比如要代替前面說到的∏值,應爲:

 

#define PAI 3.14159

 

注意,宏定義不是C或C++嚴格意義上的語句,所以其行末不用加分號結束。

 

宏名稱的取名規則和變量名一樣,所以我們這裏用PAI來表示∏,因爲C、C++不能直接使用∏字符。有了上面的語句,我們在程序中凡是要用到3.14159的地方都可以使用PAI這個宏來取代。

作爲一種建議和一種廣大程序員共同的習慣,宏名稱經常使用全部大寫的字母。

 

假設原來有一段代碼:

 

double zc = 2 * 3.14159 * R; //求圓周長,其中R是代表半徑的變量

double mj = 3.14159 * R * R; //求圓面積

 

在定義了宏PAI以後,我們就可以這樣使用:

#define PAI 3.14159

 

double = 2 * PAI * R; //求圓周長,其中R是代表半徑的變量

double = PAI * R * R; //求圓面積

 

用宏來取代常數,好處是:

 

1)讓代碼更簡潔明瞭

當然,這有賴於你爲宏取一個適當的名字。一般來說,宏的名字更要注重有明確直觀的意義,有時寧可讓它長點。

2)方便代碼維護

就如前面說的3.14159。哪天你發現這個∏值精度不夠,想改爲3.1415926,那麼你只修改一處宏,而不是修改代碼中的所有宏。

原來的宏:

#define PAI 3.14159

修改後的宏:

#define PAI 3.1415926

 

對宏的處理,在編譯過程中稱爲“預處理”。也就是說在正式編譯前,編譯器必須先將代碼出現的宏,用其相應的宏值替換,這個過程有點你我在文字處理軟件中的查找替換。完成預處理後,所有原來的“PAI”都成了立即數3.1415926。所以在代碼中使用宏表達常數,歸根結底還是使用了立即數,並沒有明確指定這個量的類型。這容易帶來一些問題,所以C++使用另一更穩妥的方法來代替宏的這一功能。

常量定義

常量定義的格式爲:

 

const 數據類型 常量名 = 常量值;

 

相比變量定義的格式,常量定義必須以 const 開始,另外,常量必須在定義的同時,完成賦值。

 

const float PAI = 3.1415926;

 

const 的作用就是指明這個量(PAI)是常量,而非變量。

常量必須一開始就指定一個值,然後,在以後的代碼中,我們不允許改變PAI的值,比如:

 

const float PAI = 3.14159;

double zc = 2 * PAI * R;

PAI = 3.1415926;        //錯誤!,PAI不能再修改。

double mj = PAI * R * R; 

 

如果一個常量是整型,可以省略指出數據類型,如:

const k = 100;

相當於

const int k = 100;

 

反過來說,如果不指定數據類型,則編譯器將它當成整型。比如:

const k = 1.234;

雖然你想讓k等於一個實型數,然而,最終k的值其實是1。因爲編譯器把它當成整型常量。

我們建議在定義變量時,明確指出類型,不管它是整型或其它類型。

 

const int i = 100;

const double di = 100.0;

ref1:http://www.howzhi.com/course/3687/lesson/43502

ref2:http://www.cnblogs.com/particle/archive/2012/09/01/2667042.html

ref3:http://learn.akae.cn/media/ch21s02.html(宏定義的使用)

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