C語(yǔ)言程序設(shè)計(jì)第九章課件.ppt_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì)第九章課件.ppt_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì)第九章課件.ppt_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì)第九章課件.ppt_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì)第九章課件.ppt_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、C語(yǔ)言程序設(shè)計(jì),主講:龔文引,第九講:預(yù)處理命令,提綱,宏定義,基本概念,C語(yǔ)言與其他高級(jí)語(yǔ)言的一個(gè)重要區(qū)別是可以使用預(yù)處理命令和具有預(yù)處理的功能 C提供的預(yù)處理功能主要有以下三種: 1. 宏定義 2. 文件包含 3. 條件編譯 這些功能分別用宏定義命令、文件包含命令、條件編譯命令來(lái)實(shí)現(xiàn)。為了與一般C語(yǔ)句相區(qū)別,這些命令以符號(hào)”#”開頭。例如: #define, #include,9.1 宏定義,9.1.1 不帶參數(shù)的宏定義 一般形式: #define 標(biāo)識(shí)符 字符串 例如:#define PI 3.1415926 作用是在本程序文件中用指定的標(biāo)識(shí)符PI來(lái)代替“3.1415926”這個(gè)字符串,

2、在編譯預(yù)處理時(shí),將程序中在該命令以后出現(xiàn)的所有的PI都用“3.1415926”代替。 這種方法使用戶能以一個(gè)簡(jiǎn)單的名字代替一個(gè)長(zhǎng)的字符串,9.1 宏定義,例:使用不帶參數(shù)的宏定義,#include #define PI 3.1415926 void main() float l,s,r,v; printf(input radius:); scanf(%f, ,9.1 宏定義,9.1.1 不帶參數(shù)的宏定義 說(shuō)明: 宏名一般習(xí)慣用大寫字母表示,以便與變量名相區(qū)別。但這并非規(guī)定,也可用小寫字母 使用宏名代替一個(gè)字符串,可以減少程序中重復(fù)書寫某些字符串的工作量 宏定義是用宏名代替一個(gè)字符串,只作簡(jiǎn)單置

3、換,不作正確性檢查。只有在編譯已被宏展開后的源程序時(shí)才會(huì)發(fā)現(xiàn)語(yǔ)法錯(cuò)誤并報(bào)錯(cuò),9.1 宏定義,9.1.1 不帶參數(shù)的宏定義 說(shuō)明: 宏定義不是C語(yǔ)句,不必在行末加分號(hào)。如果加了分號(hào)則會(huì)連分號(hào)一起進(jìn)行置換 #define命令出現(xiàn)在程序中函數(shù)的外面,宏名的有效范圍為定義命令之后到本源文件結(jié)束。通常,#define命令寫在文件開頭,函數(shù)之前,作為文件一部分,在此文件范圍內(nèi)有效 可以用#undef命令終止宏定義的作用域 在進(jìn)行宏定義時(shí),可以引用已定義的宏名,可以層層置換,9.1 宏定義,#define #undef舉例,#define G 9.8 void main() #undef G f1() ,在

4、f1函數(shù)中, G不再代表9.8. 這樣 可以靈活控制宏定義的作用范圍,9.1 宏定義,例:在宏定義中引用已定義的宏名,#include #define R 3.0 #define PI 3.1415926 #define L 2*PI*R #define S PI*R*R void main() printf(L=%fnS=%fn, L, S); ,L=18.849556 S=28.274333,經(jīng)過(guò)宏展開后,printf函數(shù)中的輸出項(xiàng)L被展開為: 2*3.1415926*3.0 S展開為 3.1415926*3.0*3.0,9.1 宏定義,9.1.1 不帶參數(shù)的宏定義 對(duì)程序中用雙撇號(hào)括起來(lái)

5、的字符串內(nèi)的字符,即使與宏名相同,也不進(jìn)行置換 例如: printf(“PI = %fn”, PI); 則輸出結(jié)果為: PI = 3.141593 宏定義是專門用于預(yù)處理命令的一個(gè)專用名詞,它與定義變量的含義不同,只作字符替換,不分配內(nèi)存空間,9.1 宏定義,#include #define F x+y void main() int x=3,y=5,z; z=2*F; printf(n %d, z); ,11,#include #define F (x+y) void main() int x=3,y=5,z; z=2*F; printf(n %d, z); ,16,9.1 宏定義,9.1.

6、2 帶參數(shù)的宏定義 作用:不是進(jìn)行簡(jiǎn)單的字符串替換,還要進(jìn)行參數(shù)替換 一般形式: #define 宏名(參數(shù)表列) 字符串 字符串中包含在括弧中所指定的參數(shù),#define S(a,b) a*b . area=S(3,2); 程序中用3和2分別代替宏定義中的形式參數(shù)a和b,用3*2代替S(3,2) 。 因此賦值語(yǔ)句展開為:area=3*2,9.1 宏定義,帶參的宏定義過(guò)程 對(duì)帶實(shí)參的宏(如S(3,2),則按#define命令行中指定的字符串從左到右進(jìn)行置換。若串中包含宏中的形參(如a、b),則將程序中相應(yīng)的實(shí)參(可以是常量、變量或表達(dá)式)代替形參。如果宏定義中的字符串中的字符不是參數(shù)字符(如a

7、*b中的*號(hào)),則保留。這樣就形成了置換的字符串,9.1 宏定義,帶參宏定義說(shuō)明: 對(duì)帶參數(shù)的宏展開只是將語(yǔ)句中的宏名后面括號(hào)內(nèi)的實(shí)參字符串代替#define 命令行中的形參,#include #define S(a, b) a*b void main() printf(“%dn”, S(2+3, 3+5); ,#include #define S(a, b) (a)*(b) void main() printf(“%dn”, S(2+3, 3+5); ,2+3*3+5,(2+3)*(3+5),9.1 宏定義,帶參宏定義說(shuō)明: 在宏定義時(shí),在宏名與帶參數(shù)的括弧之間不應(yīng)加空格,否則將空格以后的字

8、符都作為替代字符串的一部分,定義: #define S (r) PI*r*r 則 area = S(a)的展開為: area = (r) PI*r*r(a),9.1 宏定義,帶參數(shù)的宏和函數(shù)的區(qū)別 函數(shù)調(diào)用時(shí),先求出實(shí)參表達(dá)式的值,然后代入形參。而使用帶參的宏只是進(jìn)行簡(jiǎn)單的字符替換 函數(shù)調(diào)用是在程序運(yùn)行時(shí)處理的,為形參分配臨時(shí)的內(nèi)存單元。而宏展開則是在編譯前進(jìn)行的,在展開時(shí)并不分配內(nèi)存單元,不進(jìn)行值的傳遞處理,也沒(méi)有“返回值”的概念 對(duì)函數(shù)中的實(shí)參和形參類型要求一致。而宏名無(wú)類型,它的參數(shù)也無(wú)類型,只是一個(gè)符號(hào)代表,展開時(shí)代入指定的字符串即可。宏定義時(shí),字符串可以是任何類型的數(shù)據(jù) 調(diào)用函數(shù)只可

9、得到一個(gè)返回值,而用宏可以設(shè)法得到幾個(gè)結(jié)果,9.1 宏定義,例: 通過(guò)宏展開得到若干個(gè)結(jié)果,#include #define PI 3.1415926 #define CIRCLE(R,L,S,V) L=2*PI*R;S=PI*R*R;V=4.0/3.0*PI*R*R*R void main() float r,l,s,v; scanf(%f, ,9.1 宏定義,對(duì)宏進(jìn)行預(yù)編譯,展開后的main函數(shù)如下:,void main() float r,l,s,v; scanf(%f, ,3.5 r=3.50,l=21.99,s=38.48,v=179.59,9.1 宏定義,帶參數(shù)的宏和函數(shù)的區(qū)別 使

10、用宏次數(shù)多時(shí),宏展開后源程序長(zhǎng),因?yàn)槊空归_一次都使程序增長(zhǎng),而函數(shù)調(diào)用不會(huì)使源程序變長(zhǎng) 宏替換不占運(yùn)行時(shí)間,只占編譯時(shí)間。而函數(shù)調(diào)用則占運(yùn)行時(shí)間(分配單元、保留現(xiàn)場(chǎng)、值傳遞、返回),如果善于利用宏定義,可以實(shí)現(xiàn)程序的簡(jiǎn)化. 比如: 事先將程序中的“輸出格式”定義好,以減少在輸出語(yǔ)句 中每次都要寫出具體的輸出格式的麻煩,9.1 宏定義,#include #define PR printf #define NL n #define D %d #define D1 D NL #define D2 D D NL #define D3 D D D NL #define D4 D D D D NL #de

11、fine S %s,void main() int a,b,c,d; char string=CHINA; a=1;b=2;c=3;d=4; PR(D1,a); PR(D2,a,b); PR(D3,a,b,c); PR(D4,a,b,c,d); PR(S,string); , ,9.1 宏定義,以下程序中, 有一個(gè)不符合C語(yǔ)法規(guī)則的語(yǔ)句, 這個(gè)語(yǔ)句是_,#include #define M 10 void main() int i, n, aM*10;/* A */ scanf(“%d”, /* D */ ,B,9.1 宏定義,以下程序的執(zhí)行結(jié)果是_,#include #define SUB(X,Y) (X)*Y void main() int a = 3, b = 4; printf(“%dn”, SUB(a+, b+); A. 12B. 15C. 16D. 20,A,9.1 宏定義,以下程序的執(zhí)行結(jié)果是_,#include #define SUB(a) (a)-(a) void main() int a = 2,b = 3,c = 5, d; d = SUB(a+b)*c; printf(“%dn

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論