版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第8章編譯預(yù)處理本章要點(diǎn):無參宏定義有參宏定義文件包含學(xué)習(xí)方法建議:學(xué)習(xí)本章內(nèi)容時(shí),應(yīng)重點(diǎn)掌握無參宏定義與帶參宏定義的使用,掌握文件包含的意義,了解條件編譯的作用。1.問題描述——計(jì)算圓的周長(zhǎng)和面積的程序。輸入一個(gè)圓的半徑,輸出圓的周長(zhǎng)和面積。2.引例分析假設(shè)圓的半徑為實(shí)數(shù),利用圓的周長(zhǎng)和面積公式,進(jìn)行計(jì)算,并輸出結(jié)果。編寫程序?qū)崿F(xiàn)這些功能,可以通過函數(shù)實(shí)現(xiàn),也可以使用預(yù)處理命令等多種方法實(shí)現(xiàn)。8.1引例
3.程序代碼#include"stdio.h"/*文件包含*/#definePI3.1415926/*無參宏定義*/#defineCIRCUM(r)(2.0*PI*(r))/*有參宏定義*/#defineAREA(r)(PI*(r)*(r))/*有參宏定義*/voidmain(){floatradius,circum,area;printf("Inputradius:");scanf("%f",&radius);/*輸入圓的半徑*/circum=CIRCUM(radius);/*計(jì)算圓的周長(zhǎng)*/area=AREA(radius);/*計(jì)算圓的面積*/printf("CIRCUM=%f,AREA=%f\n",circum,area);}8.2.1無參宏定義無參宏定義的一般格式為:#define標(biāo)識(shí)符字符串其中:“define”為宏定義命令;“標(biāo)識(shí)符”為所定義的宏名?!白址笨梢允浅?shù)、表達(dá)式、格式串等。注意:宏名一般用大寫字母表示,以示與變量區(qū)別,但這并非是規(guī)定。宏定義不是C語句,所以不能在行尾加分號(hào)。否則,宏展開時(shí),會(huì)將分號(hào)作為字符串的1個(gè)字符,用于替換宏名。在宏展開時(shí),預(yù)處理程序僅以按宏定義簡(jiǎn)單替換宏名,而不作任何檢查。如果有錯(cuò)誤,只能由編譯程序在編譯宏展開后的源程序時(shí)發(fā)現(xiàn)。宏定義命令#define出現(xiàn)在函數(shù)的外部,宏名的有效范圍是:從定義命令之后,到本文件結(jié)束。通常,宏定義命令放在文件開頭處。在進(jìn)行宏定義時(shí),可以引用已定義的宏名。對(duì)雙引號(hào)括起來的字符串內(nèi)的字符,即使與宏名同名,也不進(jìn)行宏展開。8.2宏定義【例8.1從鍵盤輸入不超過100個(gè)字符,并統(tǒng)計(jì)其中英文字母(不區(qū)分大小寫)的個(gè)數(shù),直到輸入的字符為'*'或輸入的字符個(gè)數(shù)超過100為止。源程序#include"stdio.h"/*文件包含*/#defineMAXnum100/*鍵盤輸入不超過100個(gè)字符*/voidmain(){inti,count=0;charc;for(i=0;i<MAXnum;i++){c=getchar();if(c=='*')/*輸入的字符為'*'時(shí)結(jié)束*/break;if(c>='a'&&c<='z'||c>='A'&&c<='Z')++count;}printf("Count=%d",count);}8.2.2有參宏定義有參宏定義的一般格式為:#define宏名(形參表)字符串調(diào)用格式:宏名(實(shí)參表)有參宏展開:用宏調(diào)用提供的實(shí)參字符串,直接置換宏定義命令行中相應(yīng)形參字符串,非形參字符保持不變。注意:定義有參宏時(shí),宏名與左圓括號(hào)之間不能留有空格。否則,C編譯系統(tǒng)將空格以后的所有字符均作為替代字符串,而將該宏視為無參宏。有參宏的展開,只是將實(shí)參作為字符串,簡(jiǎn)單地置換形參字符串,而不做任何語法檢查?!纠?.2】從鍵盤輸入兩個(gè)整數(shù),并把其中的較大值顯示出來。
#include"stdio.h"#defineMAX(a,b)((a)>(b)?(a):(b))main(){intx,y,z;scanf("%d%d",&x,&y);z=MAX(x,y);printf("Max=%d",z);}8.3.1文件包含處理命令的格式文件包含一般形式為:
#include<文件名>或#include"文件名"其功能是用相應(yīng)文件中的全部?jī)?nèi)容來替換該預(yù)處理語句。8.3.2文件包含的優(yōu)點(diǎn)一個(gè)大程序,通常分為多個(gè)模塊,并由多個(gè)程序員分別編程。有了文件包含處理功能,就可以將多個(gè)模塊共用的數(shù)據(jù)(如符號(hào)常量和數(shù)據(jù)結(jié)構(gòu))或函數(shù),集中到一個(gè)單獨(dú)的文件中。這樣,凡是要使用其中數(shù)據(jù)或調(diào)用其中函數(shù)的程序員,只要使用文件包含處理功能,將所需文件包含進(jìn)來即可,不必再重復(fù)定義它們,從而減少重復(fù)勞動(dòng)。
8.3文件包含8.4.1#ifdef命令一般形式為:
#ifdef標(biāo)識(shí)符程序段1#else
程序段2#endif其作用是:如果標(biāo)識(shí)符已經(jīng)定義過(一般是指用#define命令定義),那么,程序段1參加編譯,否則,程序段2參加編譯。程序段1和程序段2可以包含任意條語句。程序段1或程序段2即使由多條語句組成,也不需要用花括號(hào)括起來。其中#else部分可以省略,即:
#ifdef標(biāo)識(shí)符程序段
#endif作用是:如果標(biāo)識(shí)符已定義過,則程序段參加編譯,否則,程序段不參加編譯。
8.4條件編譯8.4.2#ifndef命令
#ifndef命令的用法與#ifdef命令的用法類似,其一般形式為:
#ifndef標(biāo)識(shí)符程序段1#else
程序段2#endif其作用是:當(dāng)標(biāo)識(shí)符沒有定義時(shí),編譯程序段1,否則,編譯程序段2。其中#else部分可以省略,即:
#ifndef標(biāo)識(shí)符程序段
#endif作用是:當(dāng)標(biāo)識(shí)符沒有定義時(shí),程序段參加編譯,否則,程序段不參加編譯。8.4.3#if命令
#if預(yù)處理命令提供了按條件控制編譯過程的方法。其一般形式為:
#if表達(dá)式程序段1#else
程序段2#endif它的作用是:當(dāng)表達(dá)式為“真”(值非0)時(shí),程序段1參加編譯,否則,程序段2參加編譯。其中的#else部分可以省略。8.4.4#undef命令
#undef命令的一般形式如下所示:
#undef標(biāo)識(shí)符它的作用是:將已經(jīng)定義的標(biāo)識(shí)符變?yōu)槲炊x的。
【例8.3】交換兩個(gè)變量的值。#include"stdio.h"#defineSWAP(x,y){intt;t=x;x=y;y=t;}main(){inta,b,temp;printf("inputa&b:");scanf("%d%d",&a,&b);printf("\nBefore:a=%d\tb=%d",a,b);#ifdefSWPA/*如果SWPA被定義*/SWAP(a,b);/*調(diào)用宏*/#elsetemp=a;a=b;b=temp;#endifprintf("\nafter:a=%d\tb=%d",a,b);}【例8.4】從鍵盤輸入10個(gè)整型數(shù)據(jù),將其中的最大值或最小值顯示出來。
#include"stdio.h"#defineMFLAG1main(){inti,M;intarray[10];for(i=0;i<10;i++)scanf("%d",&array[i]);M=array[0];for(i=1;i<10;i++){#ifMFLAGif(M<array[i])M=array[i];#elseif(M>array[i])M=array[i];#endif}if(MFLAG)printf("Max=%d",M);elseprintf("Min=%d",M);}
上機(jī)實(shí)驗(yàn)
1.掌握宏定義與宏展開的應(yīng)用;
2.掌握文件包含的方法與應(yīng)用。
一、實(shí)驗(yàn)?zāi)康?.驗(yàn)證性實(shí)驗(yàn)1)分析下面程序的輸出結(jié)果,然后上機(jī)驗(yàn)證。#defineEXCH(a,b){intt;t=a;a=b;b=t;}#include"stdio.h"main(){intx=5,y=9;EXCH(x,y);printf("x=%d,y=%d\n",x,y);}
二、實(shí)驗(yàn)內(nèi)容2)下面程序用于計(jì)算兩個(gè)實(shí)數(shù)的平方及該兩個(gè)實(shí)數(shù)和的平方,請(qǐng)修改程序中的錯(cuò)誤。使之得到正確的結(jié)果。例如:輸入的兩個(gè)數(shù)分別是2和3輸出應(yīng)該是:a=2.00SQR(2.00)=4b=3.00SQR(3.00)=9a+b=5.00SQR(5.00)=25.00#include"stdio.h"#defineSQR(a)a*a/*此處有錯(cuò)誤,請(qǐng)改正*/main(){floata,b;printf("inputa&b:");scanf("%f%f",&a,&b);printf("\na=%.2f\tSQR(%.2f)=%.2f",a,a,SQR(a));printf("\nb=%.2f\tSQR(%.2f)=%.2f",b,b,SQR(b));pr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年高職核工程與核技術(shù)應(yīng)用(核設(shè)施運(yùn)行基礎(chǔ))試題及答案
- 2025年中職(增材制造技術(shù)應(yīng)用)零件打印工藝試題及答案
- 2025年大學(xué)(智慧農(nóng)業(yè)技術(shù))農(nóng)業(yè)智能化綜合測(cè)試試題及答案
- 2025年中職家庭教育(家庭教育基礎(chǔ))試題及答案
- 2025年高職大數(shù)據(jù)技術(shù)(數(shù)據(jù)操作規(guī)范)試題及答案
- 2025年大學(xué)大四(應(yīng)急管理)應(yīng)急物資儲(chǔ)備管理試題及答案
- 2025年中職(會(huì)計(jì))財(cái)務(wù)管理階段測(cè)試題及答案
- 2025年大學(xué)動(dòng)物醫(yī)學(xué)(寵物疾病預(yù)防)試題及答案
- 2025年高職農(nóng)村電氣技術(shù)(農(nóng)村電網(wǎng)建設(shè))試題及答案
- 2025年高職新聞學(xué)(新聞攝影)試題及答案
- 湖南省邵陽市2025-2026學(xué)年高二歷史上學(xué)期期末模擬卷(試卷及全解全析)
- (2025版)腹膜后腫瘤診治專家共識(shí)課件
- 基因編輯真菌鑒定
- 轉(zhuǎn)讓釣場(chǎng)合同協(xié)議書
- 溫泉洗浴行業(yè)分析報(bào)告
- 《數(shù)據(jù)管理能力成熟度模型》DCMM評(píng)估內(nèi)容及流程
- 一年級(jí)語文上冊(cè)測(cè)試題命制與批改標(biāo)準(zhǔn)
- 海外安保培訓(xùn)核心科目
- 多胎肉羊養(yǎng)殖培訓(xùn)課件
- 恒豐銀行招聘筆試題及答案
- 湖南省常德市石門一中2026屆高二上數(shù)學(xué)期末質(zhì)量跟蹤監(jiān)視試題含解析
評(píng)論
0/150
提交評(píng)論