規則7-1-1 用巨集定義表示式時,要使用完備的括號。
說明:m為巨集只是簡單的**替換,不會像函式一樣先將引數計算後,再傳遞。
示例:如下定義的巨集都存在一定的風險。
反例:
//若有除法運算,c/a*b計算錯誤
#define rectangle_area
(a, b) a*b
//a+1*b+1計算錯誤
#define rectangle_area
(a, b)
(a*b)
//若有除法運算,c/(a)*(b)計算錯誤
#define rectangle_area
(a, b)
(a)*
(b)正例:
#define rectangle
area
(a, b)
((a)
*(b)
)
規則7-1-2 使用巨集定義多行語句時, 必須使用 把這些語句括起來。
說明:在巨集定義中,對多行語句使用大括號,可以避免可能發生的錯誤。
規則7-1-3 使用巨集時,不允許引數發生變化。
例如:
有以下巨集定義:
#define square
( a )
((a)
*(a)
)反例:
int a =5;
int b;
b =square
( a++);
// 巨集引數a變化,結果:a = 7,即執行了2次加1
正例:int a =5;
int b;
b =square
( a )
;a++
;// 結果:a = 6,即只執行了 1 次加 1
規則7-1-4 不允許直接使用魔鬼數字**
什麼是**中的魔鬼數字,如何解決?
建議7-1-1 除非必要,應盡可能使用函式代替巨集。
巨集對比函式的缺點:建議7-1-2 常量建議使用const定義代替巨集。(1)巨集缺乏型別檢查,不如函式呼叫嚴格;
巨集展開可能會產生***。
(2)以巨集形式寫的**難以除錯/打斷點,不利於定位問題。
(3)巨集如果呼叫很多,會造成**空間的浪費,不如函式空間效率高。
說明:有的 c 編譯器不支援用 const 定義常量,此時只好#define。用 const 定義的常量具有型別,且在除錯時也更加方便(可以直接檢視變數值)。
建議7-1-3 巨集定義中盡量不使用return、goto、continue、break等改變程式流程的語句。
【規則 7-2-1】列舉成員不是變數,而是常數,和const定義常變數一樣,所以不能對列舉元素進行賦值。
【規則 7-2-2】列舉成員作為常量,定義的時候儲存的值按列舉順序依次預設為0,1,2……。當然,宣告時候可以修改其儲存值,即修改列舉值, 但不可以為負數,如-1,-2等,且列舉值為整數。
【規則 7-2-3】列舉成員不是簡單字串常量,使用的時候無需新增單、雙引號。
【規則 7-2-4】列舉成員不可以重複,但是列舉值可以重複。重複列舉值的列舉成員表明它們具有共同性質,所以放在一起。
【規則 7-2-5】乙個整數不能直接賦給乙個列舉變數,必須強制進行型別轉換才能賦值。
例如:
enum weeks day;
day =
(weeks)
2;
應用案例:
#include
int main()
day;
//從1開始
int k;
printf
("請輸入今天星期幾(1--7):");
scanf
("%d"
,&k)
; day=
(enum weekday)k;
switch
(day)
return0;
}
python第七章 python教程(第七章)
字典和集合 字典是python中唯一,乙個對映型別 如何建立乙個字典,如下 dict dict 滲透 網路安全 怎麼理解字典呢?現實生活中的字典可以通過首字母進行查詢要查詢的漢子,python也可以這樣理解,通過 前的元素查詢到冒號後的元素。為什麼說字典是唯一乙個對映型別呢?看圖。對映型別區別與序列...
第七章 函式
1.ansi c 允許函式原型的使用,函式宣告提供給編譯器和之後的呼叫函式返回值型別,引數型別和數量的資訊,而k c用單獨的列表給出引數的型別,編譯器只記住函式的返回值型別,但不儲存函式的引數數量和型別 2.沒有return語句的函式,隱式的返回 3.函式的原型可以單獨放於乙個標頭檔案中,一定要具有...
第七章總結
7.2.2畫直線 畫直線使用cdc類的lineto 函式兩個過載版本 bool lineto int x,int y bool lineto point point 引數x y或point指定直線的終點位置,此函式從當前點到指定的終點之間畫一條直線,當前點包括在直線上,而終點不包括在直線上。如果畫線...