第七章 巨集與列舉

2021-09-26 14:21:33 字數 2153 閱讀 5891

規則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 除非必要,應盡可能使用函式代替巨集。

巨集對比函式的缺點:

(1)巨集缺乏型別檢查,不如函式呼叫嚴格;

巨集展開可能會產生***。

(2)以巨集形式寫的**難以除錯/打斷點,不利於定位問題。

(3)巨集如果呼叫很多,會造成**空間的浪費,不如函式空間效率高。

建議7-1-2 常量建議使用const定義代替巨集。

說明:有的 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指定直線的終點位置,此函式從當前點到指定的終點之間畫一條直線,當前點包括在直線上,而終點不包括在直線上。如果畫線...