版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C語言程序設(shè)計(jì)第8章編譯預(yù)處理問題:實(shí)際生活中,為了更好地處理一些事件或數(shù)據(jù),會(huì)對(duì)其提前進(jìn)行設(shè)定和準(zhǔn)備,如:在對(duì)源程序進(jìn)行通常的編譯之前,先對(duì)程序中一些特殊的命令進(jìn)行“預(yù)處理”。編譯預(yù)處理用π代表圓周率3.14為避免重復(fù),對(duì)已有的實(shí)行“拿來主義”。
ANSIC標(biāo)準(zhǔn)規(guī)定可以在C源程序中加入一些“預(yù)處理命令”,以改進(jìn)程序設(shè)計(jì)環(huán)境,提高編程效率。引子
本章要點(diǎn)第8章編譯預(yù)處理
本章難點(diǎn)預(yù)處理的概念
C語言處理系統(tǒng)的預(yù)處理功能預(yù)處理命令的使用帶參宏定義條件編譯編譯預(yù)處理作用:對(duì)源程序編譯之前做一些處理,生成擴(kuò)展C源程序種類宏定義#define文件包含#include條件編譯#if--#else--#endif等格式:“#”開頭占單獨(dú)書寫行語句尾不加分號(hào)8.18.28.3宏定義條件編譯文件包含第8章編譯預(yù)處理如
if(x==YES)printf(“correct!\n”);elseif(x==NO)printf(“error!\n”);展開后:if(x==1)printf(“correct!\n”);elseif(x==0)printf(“error!\n”);宏定義的分類不帶參數(shù)宏定義一般形式:#define宏名[宏體]功能:用指定標(biāo)識(shí)符(宏名)代替字符序列(宏體)宏展開:預(yù)編譯時(shí),用宏體替換宏名---不作語法檢查如
#defineYES1#defineNO0#definePI3.1415926#defineOUTprintf(“Hello,World”);宏體可缺省,表示宏名定義過或取消宏體定義位置:任意(一般在函數(shù)外面)作用域:從定義命令到文件結(jié)束#undef可終止宏名作用域格式:
#undef
宏名例
#defineYES1main(){……..}#undefYES#defineYES0max(){……..}YES原作用域YES新作用域宏定義可嵌套,不能遞歸例
#defineMAXMAX+10()引號(hào)中的內(nèi)容與宏名相同也不置換例
#definePI3.14159printf(“2*PI=%f\n”,PI*2);宏展開:printf(“2*PI=%f\n”,3.14159*2);宏定義中使用必要的括號(hào)()例
#defineWIDTH80#defineLENGTH
WIDTH+40
var=LENGTH*2;宏展開:var=80+40*2;()()例
#defineWIDTH80#defineLENGTH
WIDTH+40
var=LENGTH*2;宏展開:var=80+40*2;8.1宏定義例8.1用不帶參數(shù)的宏定義計(jì)算s=3*(y*y+3*y)+4*(y*y+3*y)+5*(y*y+3*y)#defineM(y*y+3*y)main(){int
s,y;
printf("Pleaseinputanumber:");
scanf("%d",&y);s=3*M+4*M+5*M;
printf("s=%d\n",s);}運(yùn)行情況如下:Pleaseinputanumber:4↙s=336
算法分析:?jiǎn)卧谟?jì)算式子中出現(xiàn)了三個(gè)(y*y+3*y),為減少書寫量,可使用宏定義。帶參數(shù)宏定義一般形式:#define宏名(參數(shù)表)宏體例
#defineS(r)PI*r*r相當(dāng)于定義了不帶參宏S,代表字符串“(r)
PI*r*r”
宏展開:形參用實(shí)參換,其它字符保留宏體及各形參外一般應(yīng)加括號(hào)()例
#defineS(a,b)a*b………..area=S(3,2);宏展開:
area=3*2;不能加空格例
#definePOWER(x)x*xx=4;y=6;z=POWER(x+y);宏展開:z=x+y*x+y;一般寫成:#definePOWER(x)((x)*(x))宏展開:
z=((x+y)*(x+y));8.1宏定義#defineMAX(x,y)(x)>(y)?(x):(y)
main(){int
x,y,max;
printf("inputtwonumbers(x,y):");
scanf("%d,%d",&x,&y);
max=MAX(x,y);
printf("max=%d\n",max);}例8.4用帶參宏定義求兩數(shù)中的大者。運(yùn)行情況如下:inputtwonumbers(x,y):5,6↙max=6例8.5一個(gè)宏定義代表多條語句。#defineSSSV(s1,s2,s3,v)s1=l*w;s2=l*h;s3=w*h;v=w*l*h;main(){intl=3,w=4,h=5,sa,sb,sc,vv;
SSSV(sa,sb,sc,vv);
printf("sa=%d\nsb=%d\nsc=%d\nvv=%d\n",sa,sb,sc,vv);}運(yùn)行情況如下:sa=12sb=15sc=20vv=60帶參的宏與函數(shù)區(qū)別帶參宏函數(shù)處理過程不分配內(nèi)存簡(jiǎn)單的字符置換分配內(nèi)存先求實(shí)參值,再代入形參處理時(shí)間編譯時(shí)程序運(yùn)行時(shí)參數(shù)類型無類型問題定義實(shí)參,形參類型返回值無有運(yùn)行速度不占運(yùn)行時(shí)間調(diào)用和返回占時(shí)間8.18.28.3宏定義條件編譯文件包含第8章編譯預(yù)處理?xiàng)l件編譯的功能:在編譯源文件之前,根據(jù)給定的條件決定編譯的范圍。形式一:
#ifdef
標(biāo)識(shí)符程序段1#else
程序段2#endif如果標(biāo)識(shí)符是已被#define命令定義過的宏名,就對(duì)程序段1進(jìn)行編譯;否則對(duì)程序段2進(jìn)行編譯。8.2條件編譯沒有else時(shí),可省略條件編譯舉例#defineDEBUG
main(){inta=4;
#ifdefDEBUG
printf("Nowtheprogrammerisdebuggingtheprogram.");
#else
printf("a=%d.",a);#endif}若沒有第一行的宏定義命令,程序運(yùn)行后會(huì)輸出:a=4.運(yùn)行情況如下:Nowtheprogrammerisdebuggingtheprogram.條件編譯形式二:#ifndef
標(biāo)識(shí)符程序段1#else
程序段2#endif如果標(biāo)識(shí)符未被#define命令定義過,就對(duì)程序段1進(jìn)行編譯;否則對(duì)程序段2進(jìn)行編譯。形式三:#if常量表達(dá)式程序段1#else
程序段2#endif如果常量表達(dá)式的值為真(非0),就對(duì)程序段1進(jìn)行編譯;否則對(duì)程序段2進(jìn)行編譯。例8.10設(shè)置一個(gè)開關(guān),判斷輸入值是半徑還是邊長(zhǎng),實(shí)現(xiàn)求圓或正方形的面積。#defineR1main(){floatc,r,s;
printf("inputanumber:");
scanf("%f",&c);
#ifRr=3.14159*c*c;
printf("areaofroundis:%f\n",r);#elses=c*c;
printf("areaofsquareis:%f\n",s);#endif}運(yùn)行情況如下:inputanumber:3↙areaofroundis:28.274309若程序的第一行改為:#defineR0則程序運(yùn)行情況如下:inputanumber:3↙areaofsquareis:9.000000條件編譯的應(yīng)用一套程序要產(chǎn)生不同的版本(如演示版本和實(shí)際版本)、避免重復(fù)定義時(shí),往往使用條件編譯。在程序調(diào)試時(shí),經(jīng)常需要查看某些變量的中間結(jié)果。這時(shí)可以使用條件編譯,在程序中設(shè)置若干調(diào)試用的語句。例如:#defineFLAG1#ifFLAG
printf("a=%d",a);#endif8.18.28.3宏定義條件編譯文件包含第8章編譯預(yù)處理文件包含的功能:一個(gè)源文件可將另一個(gè)源文件的內(nèi)容全部包含進(jìn)來。一般形式:
#include“文件名”
或
#include<文件名>#include“file2.c”file1.cfile2.cfile1.cfile2.cABA處理過程:預(yù)編譯時(shí),用被包含文件的內(nèi)容取代該預(yù)處理命令,再對(duì)“包含”后的文件作一個(gè)源文件編譯。“”先在當(dāng)前目錄搜索,再搜索標(biāo)準(zhǔn)目錄;可指定路徑<>直接按標(biāo)準(zhǔn)目錄搜索,不能指定路徑8.3文件包含例
#include"C:\TC\F2.c"√
#include<C:\TC\F2.c>被包含文件內(nèi)容源文件(*.c)頭文件(*.h)stdio.h:EOF和NULL宏定義及輸入輸出函數(shù)的原型
math.h:各個(gè)數(shù)學(xué)函數(shù)的原型io.h:數(shù)據(jù)類型struct
ftime的定義文件包含可嵌套#include“file2.c”file1.cAfile3.cC#include“file3.c”file2.cBfile1.cAfile3.cfile2.c將那些公用的或常用的宏定義、函數(shù)原型、數(shù)據(jù)類型定義及全局變量的定義和聲明等,組織在一些頭文件中,在程序需要使用到這些信息時(shí),就用#include命令把它們包含到所需的位置上去,從而免去每次使用它們時(shí)都要重新定義或聲明的麻煩。例8.11用戶頭文件的編寫和使用
#ifndef__L8_11_H/*定義宏,以防止重復(fù)包含此頭文件*/
#define__L8_11_H#include<stdio.h>#defineADD(a,b)((a)+(b))/*定義宏,實(shí)現(xiàn)兩數(shù)的加法*/#defineSUB(a,b)((a)-(b))/*定義宏,實(shí)現(xiàn)兩數(shù)的減法*/
int
MUL(int
a,intb)/*定義函數(shù),實(shí)現(xiàn)兩數(shù)的乘法*/
{returna*b;}floatDIV(float
a,floatb)/*定義函數(shù),實(shí)現(xiàn)兩數(shù)的除法*/
{if(b!=0)returna/b;else
printf("Error!Thedenocannotbezero!");}#endif頭文件L8_11.h#include"L8_11.h"/*包含自定義頭文件*/main(){int
a,b;
int
sum,product;floatdifference,quotient;
printf("Pleaseinputtwonumbers:");
scanf("%d,%d",&a,&b);sum=ADD(a,b);difference=SUB(a,b);product=MUL(a,b);quotient=DIV(a,b);
printf("sum=%ddifference=%f\n",sum,difference);
printf("product=%dquotient=%f\n",product,quotien
溫馨提示
- 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年湘教版七年級(jí)語文下冊(cè)階段測(cè)試試卷
- 2025年統(tǒng)編版九年級(jí)歷史下冊(cè)階段測(cè)試試卷含答案
- 2025年人教A新版七年級(jí)物理下冊(cè)階段測(cè)試試卷含答案
- 2025年浙教版選擇性必修1語文上冊(cè)月考試卷含答案
- 2025年度綠色生態(tài)公園內(nèi)外裝修與景觀設(shè)計(jì)合同4篇
- 個(gè)性化教育服務(wù)合同2024年版版B版
- 二零二五版農(nóng)產(chǎn)品加工企業(yè)原料供應(yīng)合同4篇
- 二零二五年度出租車行業(yè)信息化建設(shè)合同12篇
- 二零二五年度出租車經(jīng)營(yíng)權(quán)轉(zhuǎn)讓與市場(chǎng)拓展合同3篇
- 二零二五出租車行業(yè)股權(quán)投資與業(yè)務(wù)整合合同3篇
- 消防產(chǎn)品目錄(2025年修訂本)
- 地方性分異規(guī)律下的植被演替課件高三地理二輪專題復(fù)習(xí)
- 光伏項(xiàng)目風(fēng)險(xiǎn)控制與安全方案
- 9.2提高防護(hù)能力教學(xué)設(shè)計(jì) 2024-2025學(xué)年統(tǒng)編版道德與法治七年級(jí)上冊(cè)
- 催收培訓(xùn)制度
- ISO 22003-1:2022《食品安全-第 1 部分:食品安全管理體系 審核與認(rèn)證機(jī)構(gòu)要求》中文版(機(jī)翻)
- 2024年廣東省高考地理真題(解析版)
- 2024高考物理廣東卷押題模擬含解析
- 人教版五年級(jí)上冊(cè)數(shù)學(xué)簡(jiǎn)便計(jì)算大全600題及答案
- GB/T 15945-1995電能質(zhì)量電力系統(tǒng)頻率允許偏差
- GB 32311-2015水電解制氫系統(tǒng)能效限定值及能效等級(jí)
評(píng)論
0/150
提交評(píng)論