




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、C語言程序設計,主講:龔文引,第九講:預處理命令,提綱,宏定義,基本概念,C語言與其他高級語言的一個重要區(qū)別是可以使用預處理命令和具有預處理的功能 C提供的預處理功能主要有以下三種: 1. 宏定義 2. 文件包含 3. 條件編譯 這些功能分別用宏定義命令、文件包含命令、條件編譯命令來實現(xiàn)。為了與一般C語句相區(qū)別,這些命令以符號”#”開頭。例如: #define, #include,9.1 宏定義,9.1.1 不帶參數(shù)的宏定義 一般形式: #define 標識符 字符串 例如:#define PI 3.1415926 作用是在本程序文件中用指定的標識符PI來代替“3.1415926”這個字符串,
2、在編譯預處理時,將程序中在該命令以后出現(xiàn)的所有的PI都用“3.1415926”代替。 這種方法使用戶能以一個簡單的名字代替一個長的字符串,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ù)的宏定義 說明: 宏名一般習慣用大寫字母表示,以便與變量名相區(qū)別。但這并非規(guī)定,也可用小寫字母 使用宏名代替一個字符串,可以減少程序中重復書寫某些字符串的工作量 宏定義是用宏名代替一個字符串,只作簡單置
3、換,不作正確性檢查。只有在編譯已被宏展開后的源程序時才會發(fā)現(xiàn)語法錯誤并報錯,9.1 宏定義,9.1.1 不帶參數(shù)的宏定義 說明: 宏定義不是C語句,不必在行末加分號。如果加了分號則會連分號一起進行置換 #define命令出現(xiàn)在程序中函數(shù)的外面,宏名的有效范圍為定義命令之后到本源文件結(jié)束。通常,#define命令寫在文件開頭,函數(shù)之前,作為文件一部分,在此文件范圍內(nèi)有效 可以用#undef命令終止宏定義的作用域 在進行宏定義時,可以引用已定義的宏名,可以層層置換,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)過宏展開后,printf函數(shù)中的輸出項L被展開為: 2*3.1415926*3.0 S展開為 3.1415926*3.0*3.0,9.1 宏定義,9.1.1 不帶參數(shù)的宏定義 對程序中用雙撇號括起來
5、的字符串內(nèi)的字符,即使與宏名相同,也不進行置換 例如: printf(“PI = %fn”, PI); 則輸出結(jié)果為: PI = 3.141593 宏定義是專門用于預處理命令的一個專用名詞,它與定義變量的含義不同,只作字符替換,不分配內(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ù)的宏定義 作用:不是進行簡單的字符串替換,還要進行參數(shù)替換 一般形式: #define 宏名(參數(shù)表列) 字符串 字符串中包含在括弧中所指定的參數(shù),#define S(a,b) a*b . area=S(3,2); 程序中用3和2分別代替宏定義中的形式參數(shù)a和b,用3*2代替S(3,2) 。 因此賦值語句展開為:area=3*2,9.1 宏定義,帶參的宏定義過程 對帶實參的宏(如S(3,2),則按#define命令行中指定的字符串從左到右進行置換。若串中包含宏中的形參(如a、b),則將程序中相應的實參(可以是常量、變量或表達式)代替形參。如果宏定義中的字符串中的字符不是參數(shù)字符(如a
7、*b中的*號),則保留。這樣就形成了置換的字符串,9.1 宏定義,帶參宏定義說明: 對帶參數(shù)的宏展開只是將語句中的宏名后面括號內(nèi)的實參字符串代替#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 宏定義,帶參宏定義說明: 在宏定義時,在宏名與帶參數(shù)的括弧之間不應加空格,否則將空格以后的字
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ù)調(diào)用是在程序運行時處理的,為形參分配臨時的內(nèi)存單元。而宏展開則是在編譯前進行的,在展開時并不分配內(nèi)存單元,不進行值的傳遞處理,也沒有“返回值”的概念 對函數(shù)中的實參和形參類型要求一致。而宏名無類型,它的參數(shù)也無類型,只是一個符號代表,展開時代入指定的字符串即可。宏定義時,字符串可以是任何類型的數(shù)據(jù) 調(diào)用函數(shù)只可
9、得到一個返回值,而用宏可以設法得到幾個結(jié)果,9.1 宏定義,例: 通過宏展開得到若干個結(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 宏定義,對宏進行預編譯,展開后的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ù)調(diào)用不會使源程序變長 宏替換不占運行時間,只占編譯時間。而函數(shù)調(diào)用則占運行時間(分配單元、保留現(xiàn)場、值傳遞、返回),如果善于利用宏定義,可以實現(xiàn)程序的簡化. 比如: 事先將程序中的“輸出格式”定義好,以減少在輸出語句 中每次都要寫出具體的輸出格式的麻煩,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 宏定義,以下程序中, 有一個不符合C語法規(guī)則的語句, 這個語句是_,#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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 定遠一中初中數(shù)學試卷
- 第六七單元的數(shù)學試卷
- 各地五年級期末數(shù)學試卷
- 2025年江西鷹潭市面向應屆畢業(yè)生大學生鄉(xiāng)村醫(yī)生專項招聘2人筆試歷年專業(yè)考點(難、易錯點)附帶答案詳解
- 2025年年嘉興市婦幼保健院公開招聘高層次人才35人(第一批)筆試歷年專業(yè)考點(難、易錯點)附帶答案詳解
- 2025年01月甘肅隴南康縣婦幼保健院招聘檢驗科編外專業(yè)技術人員筆試歷年專業(yè)考點(難、易錯點)附帶答案詳解
- 肝功能不全的檢測與治療
- 2025至2030超聲波處理器行業(yè)市場深度研究與戰(zhàn)略咨詢分析報告
- 2025至2030產(chǎn)權式酒店行業(yè)市場深度研究及發(fā)展前景投資可行性分析報告
- 高中溫州一模數(shù)學試卷
- 2025年重慶出版集團招聘筆試參考題庫含答案解析
- 高一下學期期末考試物理試題
- 金融產(chǎn)品網(wǎng)絡營銷管理辦法
- 2024年廣東省廣州市中考化學真題卷及答案解析
- DB21T 2414.2-2015 公共場所雙語標識英文譯法 第2部分:道路交通
- 高速公路運營公司安全管理
- 大運會志愿者培訓
- 2023年高考真題-歷史(遼寧卷) 含解析
- 化工廠消防演練方案
- 運營崗位轉(zhuǎn)正述職報告
- 2024屆高考語文二輪復習 非連續(xù)性文本閱讀 訓練(含答案)
評論
0/150
提交評論