?
1、#define宏定義
以#號(hào)開頭的都是編譯預(yù)處理指令,它們不是C語言的成分,但是C程序離不開它們,#define用來定義一個(gè)宏,程序在預(yù)處理階段將用define定義的來內(nèi)容進(jìn)行了替換。因此在程序運(yùn)行時(shí),常量表中并沒有用define定義的常量,系統(tǒng)不為它分配內(nèi)存。define定義的常量,預(yù)處理時(shí)只是直接進(jìn)行了替換,,它用來將一個(gè)標(biāo)識(shí)符定義為一個(gè)字符串,該標(biāo)識(shí)符被稱為宏名,被定義的字符串稱為替換文本。,因此在編譯時(shí)它不對(duì)宏的定義進(jìn)行檢查,作用域不影響對(duì)常量的訪問 。它的常量值只能是字符串或數(shù)字。? ? 該命令有兩種格式:一種是簡(jiǎn)單的常量宏定義, 另一種是帶參數(shù)的宏定義。
?
? ? ? 不帶參數(shù)的宏:#define< 名字 >< 值 >? ? 要注意,沒有結(jié)尾的分號(hào),因?yàn)椴皇荂的語句,名字必須是一個(gè)單詞,值可以是各種東西,宏定義是用宏名來表示一個(gè)字符串,在宏展開時(shí)又以該字符串取代宏名,這只是一種簡(jiǎn)單的代換,字符串中可以含任何字符,可以是常數(shù),也可以是表達(dá)式,預(yù)處理程序?qū)λ蛔魅魏螜z查。如有錯(cuò)誤,只能在編譯已被宏展開后的源程序時(shí)發(fā)現(xiàn)。
注意.宏定義不是說明或語句,在行末不必加分號(hào),如加上分號(hào)則連分號(hào)也一起置換。宏定義其作用域?yàn)楹甓x命令起到源程序結(jié)束。如要終止其作用域可使用#undef命令
帶參宏定義的一般形式為:#define 宏名(形參表)字符串,也是沒有結(jié)尾的分號(hào),可以帶多個(gè)參數(shù) ,#define NB(a,b)((a)>(b)?(b):(a)),? 也可以組合(嵌套)使用其他宏,注意 帶參數(shù)宏的原則 一切都要有括號(hào),參數(shù)出現(xiàn)的每個(gè)地方都要有括號(hào)。帶參數(shù)的宏在大型的程序的代碼中使用非常普遍,在#和##這兩個(gè)運(yùn)算符的幫助下可以很復(fù)雜,如“產(chǎn)生函數(shù)”,但是有些宏會(huì)被inline函數(shù)代替(C++的函數(shù))
使用宏好處:提高運(yùn)行效。
定義的標(biāo)識(shí)符不占內(nèi)存,只是一個(gè)臨時(shí)的符號(hào),預(yù)編譯后這個(gè)符號(hào)就不存在了。在簡(jiǎn)單的程序使用帶參數(shù)的宏定義可完成函數(shù)調(diào)用的功能,又能減少系統(tǒng)開銷,提高運(yùn)行效率。正如C語言中所講,函數(shù)的使用可以使程序更加模塊化,便于組織,而且可重復(fù)利用。
“方便程序的修改”。使用宏定義可以用宏代替一個(gè)在程序中經(jīng)常使用的常量。注意,是“經(jīng)?!笔褂玫?。這樣,當(dāng)需要改變這個(gè)常量的值時(shí),就不需要對(duì)整個(gè)程序一個(gè)一個(gè)進(jìn)行修改,只需修改宏定義中的常量即可。且當(dāng)常量比較長(zhǎng)時(shí),使用宏就可以用較短的有意義的標(biāo)識(shí)符來代替它,這樣編程的時(shí)候就會(huì)更方便,不容易出錯(cuò)。因此,宏定義的優(yōu)點(diǎn)就是方便和易于維護(hù)。
?
//例子:/求球的體積 #include#include //對(duì)于半徑為 r 的球,其體積的計(jì)算公式為 V =4/3*Π*r^3 //這里取Π為3.14 //這里給定r的值,求V #define PI 3.14 int main(void) { double r; scanf("%lf", &r); double sum = 0; sum = (4.0 / 3.0) * PI*pow(r, 3);//這里用PI替換掉了 3.14 printf("%f.2", sum); } #include //合例子:輸入數(shù)字查看是星期幾 int main(void) { enum week {Mon = 1, Tue, Wed, Thu, Fri, Sat, Sun}today; //在這里我們給Mon賦值了一,后面Tue以后的都相應(yīng)加一賦值 scanf("%d", &today); switch (today) { case Mon: puts("Monday"); break; case Tue: puts("Tuesday"); break; case Wed: puts("Wednesday"); break; case Thu: puts("Thursday"); break; case Fri: puts("Friday"); break; case Sat: puts("Saturday"); break; case Sun: puts("Sunday"); break; default: puts("no day"); } return 0; }
?
2、enum枚舉
? ? ? ? 枚舉型是一個(gè)集合,集合中的元素(枚舉成員)是一些命名的整型常量,元素之間用逗號(hào),隔開。它是一種用戶定義的數(shù)據(jù)類型,它用關(guān)鍵字enum以如下語法來聲明,:enum 枚舉類型名字,{名字0,...,名字n};第一個(gè)枚舉成員的默認(rèn)值為整型的0,后續(xù)枚舉成員的值在前一個(gè)成員上加1 (當(dāng)然這個(gè)是可以自定義成員值的)
? ? ? ? 枚舉類型名字通常并不真的使用,要用的是在它大括號(hào)里邊的名字,因?yàn)樗鼈兙褪浅A糠?hào),它們的類型是int,值則是依次從零到n,如 enum? week { Monday,Tuoesday,Wedenday};? 就創(chuàng)建了三個(gè)常量,Monday的值是0,Tuoesday是1,Wedenday是2,當(dāng)需要一些可以可以排列起來的常量值的時(shí)候,定義枚舉的意義就是給了這些常量名字。雖然枚舉類型可以當(dāng)類型使用,但是實(shí)際上并不常用,但是如果是有意是排比名字,用枚舉比宏定義方便,枚舉比用好些,因?yàn)槊杜e有int類型,在C 語言中,枚舉類型是被當(dāng)做 int 或者 unsigned int 類型來處理的,既然枚舉也是一種數(shù)據(jù)類型,所以它和基本數(shù)據(jù)類型一樣也可以對(duì)變量進(jìn)行聲明,枚舉也可以用typedef關(guān)鍵字將枚舉類型定義成別名,并利用該別名進(jìn)行變量聲明
注意:
1、同一個(gè)程序中不能定義同名的枚舉類型,不同的枚舉類型中也不能存在同名的命名常量
2、枚舉成員)是常量而不是變量,這個(gè)一定要搞清楚,因?yàn)槊杜e成員的是常量,所以不能對(duì)它們賦值,只能將它們的值賦給其他的變量
3、枚舉類型的定義和變量的聲明分開:如果對(duì)枚舉型的變量賦整數(shù)值時(shí),需要進(jìn)行類型轉(zhuǎn)換
?
enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN };//枚舉常量的值是可以在這里進(jìn)行自定義的 MON=1 //基本數(shù)據(jù)類型的賦值 : int a, b, c; a = 1; b = 2; c = 3; //使用枚舉賦值 : enum DAY yesterday, today, tomorrow;//枚舉定義變量 yesterday = MON; today = TUE; tomorrow = WED; // today = (enum DAY) (yesterday + 1);//強(qiáng)制類型轉(zhuǎn)換 // tomorrow = (enum DAY) 30; //強(qiáng)制類型轉(zhuǎn)換//tomorrow = 3; //錯(cuò)誤
?
枚舉在用switch-case結(jié)構(gòu)中使用非常方便.
?
//綜合例子:輸入數(shù)字查看是星期幾 #include//枚舉是define的代替 它是一個(gè)集合 //和switch連用很方便 int main() { enum week { Mon = 1,Tues, Wed, Thurs, Fri, Sat, Sun } day; //day可放到這 //enum week day;定義 scanf("%d", &day); switch (day) { case Mon: puts("Monday"); break;//1 puts代替printf輸出字符串 case Tues: puts("Tuesday"); break;// 2 case Wed: puts("Wednesday"); break;// 3 case Thurs: puts("Thursday"); break;// 4 case Fri: puts("Friday"); break;// 5 case Sat: puts("Saturday"); break;// 6 case Sun: puts("Sunday"); break;// 7 default: puts("Error!"); } return 0; }
?
枚舉型是預(yù)處理指令#define的替代,枚舉和宏其實(shí)非常類似,宏在預(yù)處理階段將名字替換成對(duì)應(yīng)的值,枚舉在編譯階段將名字替換成對(duì)應(yīng)的值,其中一個(gè)枚舉常量的占的字節(jié)數(shù)為4個(gè)字節(jié),恰好和int類型的變量占的字節(jié)數(shù)相同。
審核編輯:湯梓紅
評(píng)論