心得:
用宏表示常數
假如我們要寫一個有關圓的種種計算的程序,那麼∏(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(宏定義的使用)