項(xiàng)目五-使用函數(shù)調(diào)用各功能模塊課件_第1頁(yè)
項(xiàng)目五-使用函數(shù)調(diào)用各功能模塊課件_第2頁(yè)
項(xiàng)目五-使用函數(shù)調(diào)用各功能模塊課件_第3頁(yè)
項(xiàng)目五-使用函數(shù)調(diào)用各功能模塊課件_第4頁(yè)
項(xiàng)目五-使用函數(shù)調(diào)用各功能模塊課件_第5頁(yè)
已閱讀5頁(yè),還剩136頁(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、大連理工大學(xué)出版社C語(yǔ)言程序設(shè)計(jì)案例教程項(xiàng)目五 使用函數(shù)調(diào)用各功能模塊教學(xué)目的:通過(guò)本章的學(xué)習(xí),要求能熟練掌握函數(shù)的定義和調(diào)用方法,掌握函數(shù)的嵌套調(diào)用和遞歸調(diào)用,理解變量的作用域和存儲(chǔ)類別,掌握內(nèi)部函數(shù)和外部函數(shù),并能夠在不同情況下靈活選擇函數(shù)來(lái)解決實(shí)際問(wèn)題。掌握編譯預(yù)處理命令的使用方法。函數(shù)和預(yù)處理命令是編寫模塊化程序的重要方法,這將為編寫比較復(fù)雜的程序設(shè)計(jì)的學(xué)習(xí)打下基礎(chǔ)。教學(xué)內(nèi)容 項(xiàng)目五 使用函數(shù)調(diào)用各功能模塊函數(shù)編譯預(yù)處理函數(shù)的定義函數(shù)調(diào)用變量的作用域和存儲(chǔ)類別內(nèi)部函數(shù)和外部函數(shù)文件包含命令宏定義條件編譯項(xiàng)目五 使用函數(shù)調(diào)用各功能模塊重點(diǎn):()函數(shù)的定義和函數(shù)調(diào)用(2)函數(shù)的參數(shù)傳遞難點(diǎn)

2、 : 、函數(shù)的參數(shù)傳遞、遞歸調(diào)用、變量的作用域和存儲(chǔ)特性重點(diǎn)和難點(diǎn)任務(wù)使用函數(shù)統(tǒng)計(jì)課程分?jǐn)?shù)信息1)問(wèn)題情景與實(shí)現(xiàn)輔導(dǎo)員張老師在使用小王設(shè)計(jì)的程序時(shí),發(fā)現(xiàn)他分別要對(duì)每門課程學(xué)生成績(jī)的總分及平均分進(jìn)行計(jì)算,如果這樣的計(jì)算過(guò)程需要重復(fù)使用或者在其他場(chǎng)合中多次使用,使用以前的方法將使得程序代碼重復(fù)書寫,在本任務(wù)中我們使用函數(shù)來(lái)統(tǒng)計(jì)課程分?jǐn)?shù)信息,可以減少編程工作量,完善了原來(lái)的程序,幫助張老師解決了該問(wèn)題。任務(wù)使用函數(shù)統(tǒng)計(jì)課程分?jǐn)?shù)信息/* 功能:使用函數(shù)統(tǒng)計(jì)課程分?jǐn)?shù)信息*/#include #define MAX 1000#define M 100float sumM,aveM;int i,j;int

3、count;int course;float aMAXM;void input()printf(請(qǐng)輸入課程的門數(shù):);scanf(%d,&course); printf(請(qǐng)輸入學(xué)生總?cè)藬?shù):);scanf(%d,&count);printf(“請(qǐng)輸入每個(gè)學(xué)生的課程成績(jī):”);任務(wù)使用函數(shù)統(tǒng)計(jì)課程分?jǐn)?shù)信息for(i=0;icount;i+) for(j=0;jcourse;j+) scanf(%f,&aij);void sum_ave(int s,int r)for(i=0;ir;i+) sumi=0.0; for(j=0;js;j+) 任務(wù)使用函數(shù)統(tǒng)計(jì)課程分?jǐn)?shù)信息 sumi=sumi+aji;

4、avei=sumi/s;void output()for(i=0;i0) return(1); if(x=0) return(0); if(x b) c=1;else if(a=b) c=0;else c=-1;return c;編譯、連接、和運(yùn)行程序。程序運(yùn)行后,屏幕顯示:5.4 函數(shù)調(diào)用 5.4.1 函數(shù)調(diào)用的一般形式如果按自左向右順序求實(shí)參的值,則函數(shù)調(diào)用相當(dāng)于compare(2,3),程序運(yùn)行的結(jié)果應(yīng)為”-1”。若按自右向左順序求實(shí)參的值,則相當(dāng)于compare(3,3),程序運(yùn)行結(jié)果為”0”。如果不清楚自己所用的編譯器對(duì)實(shí)參的求值順序,用上述代碼上機(jī)一試就清楚了。注意:由于不同的編譯

5、器對(duì)實(shí)參的求值順序不一樣,為了使程序的通用性不受影響以及避免大家對(duì)同一段代碼產(chǎn)生不同的理解,應(yīng)盡量避免使用這種容易混淆的用法。5.4 函數(shù)調(diào)用函數(shù)出現(xiàn)在一個(gè)表達(dá)式中,這種表達(dá)式稱為函數(shù)表達(dá)式。這時(shí)要求函數(shù)帶回一個(gè)確定的值以參加表達(dá)式的運(yùn)算。例如:s=sum(a,b)+sum(x,y);5.4.2 函數(shù)調(diào)用的方式1.函數(shù)語(yǔ)句按函數(shù)在程序中出現(xiàn)的位置來(lái)分,可以有一下三種函數(shù)調(diào)用的方式。把函數(shù)調(diào)用作為一個(gè)語(yǔ)句。如例5.1中的printstart();這時(shí)不要求函數(shù)帶返回值,只要求函數(shù)完成一些操作。2.函數(shù)表達(dá)式5.4 函數(shù)調(diào)用 5.4.2 函數(shù)調(diào)用的方式 函數(shù)調(diào)用作為一個(gè)函數(shù)的參數(shù),例如:s=sum

6、(a,sum(b,c);其中,sum(b,c)是一次函數(shù)調(diào)用,它的值作為sum另一次調(diào)用的參數(shù)。s的值為a,b,c三數(shù)的總和。其實(shí),函數(shù)調(diào)用作為函數(shù)的參數(shù),也是函數(shù)表達(dá)式調(diào)用的一種形式,因?yàn)楹瘮?shù)參數(shù)本身就是一個(gè)表達(dá)式的形式。3.函數(shù)參數(shù)函數(shù)sum是表達(dá)式的一部分,將sum(a,b)的值加上sum(x,y)的和賦值給s。5.4 函數(shù)調(diào)用如果一個(gè)函數(shù)要調(diào)用另外一個(gè)函數(shù),首先是被調(diào)用的函數(shù)必須存在。其次還應(yīng)在主調(diào)函數(shù)中對(duì)所有被調(diào)函數(shù)加以說(shuō)明,否則,在連接時(shí)會(huì)出現(xiàn)找不到所調(diào)用函數(shù)的錯(cuò)誤信息。同變量一樣,函數(shù)的調(diào)用也應(yīng)遵循“先定義后使用”的原則。 對(duì)被調(diào)函數(shù)的聲明分為兩種情況:(1)如果被調(diào)函數(shù)是C語(yǔ)言

7、系統(tǒng)提供的標(biāo)準(zhǔn)庫(kù)函數(shù),則在源程序文件的開頭處,使用#include命令,將存放所調(diào)用庫(kù)函數(shù)的有關(guān)“頭文件”包含到該程序文件中來(lái)。 5.4.3 對(duì)被調(diào)用函數(shù)的聲明和函數(shù)原型5.4 函數(shù)調(diào)用 5.4.3 對(duì)被調(diào)用函數(shù)的聲明和函數(shù)原型#include命令的一般形式為: #include或#include stdio.h(2)如果被調(diào)用函數(shù)為用戶自己定義的函數(shù),一般情況下,應(yīng)在主調(diào)函數(shù)中對(duì)被調(diào)用函數(shù)(返回值)的類型進(jìn)行說(shuō)明。函數(shù)的說(shuō)明方法是:在主調(diào)函數(shù)的聲明部分對(duì)被調(diào)函數(shù)進(jìn)行聲明。在主調(diào)函數(shù)中對(duì)被調(diào)函數(shù)作說(shuō)明的目的是使編譯系統(tǒng)知道被調(diào)函數(shù)返回值的類型,以便在主調(diào)函數(shù)中按此種類型對(duì)返回值作相應(yīng)的處理。5

8、.4 函數(shù)調(diào)用 5.4.3 對(duì)被調(diào)用函數(shù)的聲明和函數(shù)原型其一般形式為:類型說(shuō)明符 被調(diào)函數(shù)名(類型 形參,類型 形參); 或者:類型說(shuō)明符 被調(diào)函數(shù)名(類型,類型); 括號(hào)內(nèi)給出了形參的類型和形參名,或只給出形參類型。這便于編譯系統(tǒng)進(jìn)行檢錯(cuò),以防止可能出現(xiàn)的錯(cuò)誤。5.4 函數(shù)調(diào)用 5.4.3 對(duì)被調(diào)用函數(shù)的聲明和函數(shù)原型例5.1 main函數(shù)對(duì)printstart()函數(shù)的說(shuō)明為:void printstart();例5.2 main函數(shù)對(duì)sum()函數(shù)的說(shuō)明為:int sum(int x,int y);也可以寫成:int sum(int ,int);5.4 函數(shù)調(diào)用 5.4.3 對(duì)被調(diào)用函數(shù)

9、的聲明和函數(shù)原型語(yǔ)言中規(guī)定在以下幾種情況時(shí)可以省去在主調(diào)函數(shù)中對(duì)被調(diào)函數(shù)的函數(shù)說(shuō)明。1) 當(dāng)被調(diào)函數(shù)的返回值是整型或字符型時(shí),可以不對(duì)被調(diào)函數(shù)作說(shuō)明。這時(shí)系統(tǒng)會(huì)自動(dòng)對(duì)被調(diào)函數(shù)返回值按整型處理。例5.3的主函數(shù)中把函數(shù)聲明語(yǔ)句int compare(int a,int b);注釋掉而直接調(diào)用就屬于這種情況。5.4 函數(shù)調(diào)用 5.4.3 對(duì)被調(diào)用函數(shù)的聲明和函數(shù)原型2) 當(dāng)被調(diào)函數(shù)的函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前時(shí),在主調(diào)函數(shù)中也可以不對(duì)被調(diào)函數(shù)再作說(shuō)明而直接調(diào)用。例如例5.1中,函數(shù)printstart()的定義放在 menu() 函數(shù)之前,因此可在 menu()函數(shù)中省去對(duì)printstart()

10、函數(shù)的函數(shù)說(shuō)明void printstart();3) 如在所有函數(shù)定義之前,在函數(shù)外預(yù)先說(shuō)明了各個(gè)函數(shù)的類型,則在以后的各主調(diào)函數(shù)中,可以不再對(duì)被調(diào)函數(shù)作說(shuō)明。例如: long factor (int a); long sum(int b);5.4 函數(shù)調(diào)用 5.4.3 對(duì)被調(diào)用函數(shù)的聲明和函數(shù)原型void main() long factor (int a) long sum(int b) 其中第一、二行對(duì)factor函數(shù)和sum函數(shù)預(yù)先作了說(shuō)明。因此在以后各函數(shù)中無(wú)須對(duì)factor和sum函數(shù)再作說(shuō)明就可直接調(diào)用。5.5 函數(shù)的嵌套調(diào)用和遞歸調(diào)用 【例5.4】計(jì)算 = 1!+2!+ +

11、n!(n1,20的整數(shù),從鍵盤輸入)。算法設(shè)計(jì)要點(diǎn):本案例可以設(shè)計(jì)2個(gè)函數(shù):factor( )用于求n??;sum( )通過(guò)調(diào)用factor( )來(lái)實(shí)現(xiàn)求。5.5.1 函數(shù)的嵌套調(diào)用實(shí)例 /*源文件名:Li5_4.c 功能:求階乘和 */ #include stdio.h long factor(int n)/*定義求階乘函數(shù)factor()*/ int i;long f=1;for(i=1;i=n;i+)f=f*i;return f; 5.5 函數(shù)的嵌套調(diào)用和遞歸調(diào)用 5.5.1 函數(shù)的嵌套調(diào)用實(shí)例long sum(int m)/*定義求和函數(shù)sum()*/int i;long s=0;for

12、(i=1;i1)f=n*factor(n-1);else f=1;return f;void main()int n;long s;printf(please input a number:);scanf(%d,&n);s=factor(n);/*調(diào)用factor()函數(shù)*/printf(%d!=%ldn,n,s);5.5 函數(shù)的嵌套調(diào)用和遞歸調(diào)用其中,factor函數(shù)在定義的過(guò)程中調(diào)用了本身,這種情況叫做函數(shù)的遞歸調(diào)用。5.5.3 函數(shù)的遞歸調(diào)用實(shí)例編譯、連接、和運(yùn)行程序。程序運(yùn)行后,屏幕顯示:5.5 函數(shù)的嵌套調(diào)用和遞歸調(diào)用一個(gè)函數(shù)在它的函數(shù)體內(nèi)調(diào)用它自身稱為遞歸調(diào)用。這種函數(shù)稱為遞歸函數(shù)

13、。語(yǔ)言允許函數(shù)的遞歸調(diào)用。在遞歸調(diào)用中,主調(diào)函數(shù)又是被調(diào)函數(shù)。執(zhí)行遞歸函數(shù)將反復(fù)調(diào)用其自身,每調(diào)用一次就進(jìn)入新的一層。下面以例5.5說(shuō)明一下遞歸的執(zhí)行過(guò)程。設(shè)執(zhí)行本程序時(shí)輸入為5,即求5!。在主函數(shù)中的調(diào)用語(yǔ)句即為s=factor(5);,進(jìn)入factor函數(shù)后,由于n=5,大于1,故應(yīng)執(zhí)行f=n*factor(n*1),即f=factor(5-1)*5。該語(yǔ)句對(duì)factor函數(shù)作遞歸調(diào)用即factor(4)。5.5.4 函數(shù)的遞歸調(diào)用說(shuō)明進(jìn)行四次遞歸調(diào)用后,factor函數(shù)形參取得的值變?yōu)?,故不再繼續(xù)遞歸調(diào)用而開始逐層返回主調(diào)函數(shù)。factor(1)的函數(shù)返回值為1,factor(2)的返

14、回值為2*1=2,factor(3)的返回值為3*2=6,factor(4)的返回值為4*6=24,最后返回值factor(5)為5*24=120。注意:為了防止遞歸調(diào)用無(wú)終止地進(jìn)行,必須在函數(shù)內(nèi)有終止遞歸調(diào)用的手段。常用的方法是加條件對(duì)遞歸是否繼續(xù)進(jìn)行判斷,滿足某種條件后就不再作遞歸調(diào)用,而是逐層返回。如例5.5中的條件if(n1)就是控制遞歸繼續(xù)的條件,當(dāng)n不小于1的時(shí)候遞歸就終止,開始回朔的過(guò)程。5.5 函數(shù)的嵌套調(diào)用和遞歸調(diào)用 5.5.4 函數(shù)的遞歸調(diào)用說(shuō)明5.6 內(nèi)部函數(shù)和外部函數(shù)一個(gè)函數(shù)如果只能被本文件中其它函數(shù)所調(diào)用,稱為內(nèi)部函數(shù),內(nèi)部函數(shù)又稱靜態(tài)函數(shù)。在定義內(nèi)部函數(shù)時(shí)在函數(shù)名和

15、函數(shù)類型前面加static。即:static 函數(shù)類型 函數(shù)名(形參列表)函數(shù)體5.6.1 內(nèi)部函數(shù)5.5 內(nèi)部函數(shù)和外部函數(shù) 5.1 內(nèi)部函數(shù)例:static int fun(int a,int b)特點(diǎn):只能被本文件中的函數(shù)所調(diào)用。優(yōu)點(diǎn):不用擔(dān)心與其它源文件中的函數(shù)同名,因?yàn)榧词雇矝](méi)關(guān)系。一個(gè)函數(shù)可以被其它文件中其它函數(shù)所調(diào)用,就稱為外部函數(shù)。在定義函數(shù)時(shí)可冠以關(guān)鍵字extern(省略也可),表示此函數(shù)是外部函數(shù)。即:extern 函數(shù)類型 函數(shù)名(形參列表)函數(shù)體如:extern int fun(int a,int b)5.5 內(nèi)部函數(shù)和外部函數(shù)5.6.2 外部函數(shù)5.6 內(nèi)部函數(shù)和

16、外部函數(shù) 5.6.2 外部函數(shù)特點(diǎn):允許被所有源文件中的函數(shù)所調(diào)用。注意:調(diào)用其它源文件中的外部函數(shù)時(shí),需要對(duì)其進(jìn)行說(shuō)明?!纠?.6】以多文件的形式實(shí)現(xiàn)加、減、乘、除和求余數(shù)運(yùn)算程序說(shuō)明:將實(shí)現(xiàn)加、減、乘、除和求余數(shù)運(yùn)算的程序段分別作為1個(gè)獨(dú)立的函數(shù)、存儲(chǔ)在1個(gè)獨(dú)立的源文件中。5.6 內(nèi)部函數(shù)和外部函數(shù) 5.6.2 外部函數(shù)程序框架如下(完整程序詳見(jiàn)【例5.6】源代碼):分別創(chuàng)建addition.c源文件、subtraction.c源文件、multiplication.c源文件、division.c源文件、remainder.c源文件,分別在各源文件中實(shí)現(xiàn)相應(yīng)的加、減、乘、除和求余數(shù)函數(shù)的功能

17、。編譯、連接、和運(yùn)行程序。程序運(yùn)行后,屏幕顯示:5.6 內(nèi)部函數(shù)和外部函數(shù) 5.6.2 外部函數(shù)5.6 內(nèi)部函數(shù)和外部函數(shù)在軟件工程項(xiàng)目中,采用結(jié)構(gòu)化方法進(jìn)行程序設(shè)計(jì)與編程,通常會(huì)產(chǎn)生多個(gè)源文件(例如源程序文件、數(shù)據(jù)結(jié)構(gòu)定義文件等)。那么,如何將這些源文件編譯、連接成一個(gè)統(tǒng)一的可執(zhí)行文件呢?5.6.3 多個(gè)源文件的編譯與連接5.6 內(nèi)部函數(shù)和外部函數(shù) 5.6.3 多個(gè)源文件的編譯與連接一般有兩種方法:1. 分別編譯、一并連接C編譯程序是以源文件為編譯單位。當(dāng)一個(gè)程序中的函數(shù)和數(shù)據(jù)結(jié)構(gòu)分放在多個(gè)源文件中時(shí),先將各文件分別編譯,再通過(guò)link命令產(chǎn)生一個(gè)可執(zhí)行文件(.exe) 。 2. 集中編譯、

18、連接利用編譯預(yù)處理命令#include,將其它源文件包含到主函數(shù)main( )所在的源文件的開頭,然后直接編譯該文件即可。 5.6 內(nèi)部函數(shù)和外部函數(shù) 5.6.3 多個(gè)源文件的編譯與連接【例5.7】先通過(guò)添加源文件的操作將addition.c源文件,subtraction.c源文件,multiplication.c源文件,division.c源文件,remainder.c源文件添加到本工程(加減乘除求余)來(lái),然后在其主函數(shù)main()里添加如下幾行:/* 源文件名:Li5_7.c 功能:以多文件的形式實(shí)現(xiàn)加、減、乘、除和求余數(shù)運(yùn)算*/*將其它各源文件包含進(jìn)來(lái)*/#include additio

19、n.c#include subtraction.c#include multiplication.c#include division.c#include remainder.c void main( ) 5.7變量的作用域 局部變量也稱為內(nèi)部變量。局部變量是在函數(shù)內(nèi)(包括函數(shù)說(shuō)明和函數(shù)體)作定義說(shuō)明的,其作用域僅限于函數(shù)內(nèi), 離開該函數(shù)后再使用這種變量是非法的。5.7.1 局部變量 【例5.8】局部變量的作用域 /* 源文件名:Li5_8.c 功能:測(cè)試局部變量的作用域 */#include stdio.hvoid test(int a)int b=20;printf(%dn,a+b);5.

20、7變量的作用域 5.7.1 局部變量void main() int i=2,j=3,k; k=i+j; int k=8; printf(%dn,k); printf(%dn,k);test(k);5.7變量的作用域 5.7.1 局部變量在函數(shù)test內(nèi)定義了三個(gè)變量,a為形參,b為一般變量。在 test的范圍內(nèi)a、b有效,或者說(shuō)a、b變量的作用域限于test內(nèi)。同理,i,j,k的作用域限于main內(nèi)。編譯、連接、和運(yùn)行程序。程序運(yùn)行后,屏幕顯示:5.7變量的作用域 5.7.1 局部變量關(guān)于局部變量的作用域還要說(shuō)明以下幾點(diǎn):(1) 主函數(shù)中定義的變量只能在主函數(shù)中使用,不能在其它函數(shù)中使用。同時(shí)

21、,主函數(shù)中也不能使用其它函數(shù)中定義的變量。因?yàn)橹骱瘮?shù)也是一個(gè)函數(shù),它與其它函數(shù)是平行關(guān)系。這一點(diǎn)是與其它語(yǔ)言不同的,應(yīng)予以注意。(2) 形參變量是屬于被調(diào)函數(shù)的局部變量,實(shí)參變量是屬于主調(diào)函數(shù)的局部變量。(3) 允許在不同的函數(shù)中使用相同的變量名,它們代表不同的對(duì)象,分配不同的單元,互不干擾,也不會(huì)發(fā)生混淆。(4) 在復(fù)合語(yǔ)句中也可定義變量,其作用域只在復(fù)合語(yǔ)句范圍內(nèi)。6.7變量的作用域全局變量也稱為外部變量,它是在函數(shù)外部定義的變量。它不屬于哪一個(gè)函數(shù),它屬于整個(gè)源程序文件。其作用域是整個(gè)源程序。在函數(shù)中使用全局變量,一般應(yīng)作全局變量說(shuō)明。 只有在函數(shù)內(nèi)經(jīng)過(guò)說(shuō)明的全局變量才能使用。全局變量的

22、說(shuō)明符為extern。但在一個(gè)函數(shù)之前定義的全局變量,在該函數(shù)內(nèi)使用可不再加以說(shuō)明。5.7.2 全局變量5.7變量的作用域 5.7.2 全局變量【例5.9】要求設(shè)計(jì)一個(gè)函數(shù)cuboid(double length, double width, double height)(3個(gè)參數(shù)依次為長(zhǎng)方體的長(zhǎng)、寬、高),用于求長(zhǎng)方體的體積及正、側(cè)、頂三個(gè)面的面積。行數(shù)據(jù)共享。 /* 源文件名:Li5_9.c 功能:求長(zhǎng)方體的體積及正、側(cè)、頂三個(gè)面的面積 */#include stdio.hdouble area1, area2, area3;/*定義3個(gè)外部變量,用于數(shù)據(jù)共享*/double cuboid

23、 (double length, double width, double height);/*函數(shù)說(shuō)明*/5.7變量的作用域 5.7.2 全局變量void main( )double volume,length,width,height; printf(please input the cuboids length、width and height:);scanf(%lf%lf%lf,&length,&width,&height);volume = cuboid (length, width, height);printf(“n volume = %.2lf, area1 = %.2lf,

24、area2 = %.2lf, area3 = %.2lfn , volume, area1, area2, area3);double cuboid (double length, double width, double height)double volume;volume = length * width * height;/*計(jì)算體積*/area1= length * width; /*計(jì)算3個(gè)面的面積*/5.7變量的作用域 5.7.2 全局變量area2= width * height; area3= length * height;return( volume);/*返回體積值*/

25、編譯、連接、和運(yùn)行程序。程序運(yùn)行后,屏幕顯示:5.7變量的作用域 5.7.2 全局變量注意:(1)外部變量的作用域:從定義點(diǎn)到本文件結(jié)束。為方便使用,建議將外部變量的定義放在文件開頭,如例.9所示。(2)在同一源文件中,允許外部變量和內(nèi)部變量同名。在內(nèi)部變量的作用域內(nèi),外部變量不起作用。(3)外部變量可實(shí)現(xiàn)函數(shù)之間的數(shù)據(jù)共享,但又使這些函數(shù)依賴這些外部變量,因而使得這些函數(shù)的獨(dú)立性降低。從模塊化程序設(shè)計(jì)觀點(diǎn)來(lái)看,這是不利的。因此不是非用不可時(shí),不要使用外部變量。5.8 變量的存儲(chǔ)類別 語(yǔ)言中的變量,不僅有類型特性,還有存儲(chǔ)特性,從變量值存在的時(shí)間(即生存期)角度來(lái)分,可以分為靜態(tài)存儲(chǔ)方式和動(dòng)態(tài)

26、存儲(chǔ)方式。1動(dòng)態(tài)存儲(chǔ)方式:是在程序運(yùn)行期間根據(jù)需要進(jìn)行動(dòng)態(tài)的分配存儲(chǔ)空間的方式。自動(dòng)內(nèi)部變量(auto)、寄存器變量(register)5.8.1 動(dòng)態(tài)存儲(chǔ)和靜態(tài)存儲(chǔ)5.8 變量的存儲(chǔ)類別 5.8.1 動(dòng)態(tài)存儲(chǔ)和靜態(tài)存儲(chǔ)2靜態(tài)存儲(chǔ)方式:是指在程序運(yùn)行期間分配固定的存儲(chǔ)空間的方式。靜態(tài)內(nèi)部變量(static)、外部變量(extern) 。用戶存儲(chǔ)空間可以分為三個(gè)部分:(1) 程序區(qū);(2) 靜態(tài)存儲(chǔ)區(qū);(3) 動(dòng)態(tài)存儲(chǔ)區(qū);5.8 變量的存儲(chǔ)類別 5.8.1 動(dòng)態(tài)存儲(chǔ)和靜態(tài)存儲(chǔ)全局變量全部存放在靜態(tài)存儲(chǔ)區(qū),在程序開始執(zhí)行時(shí)給全局變量分配存儲(chǔ)區(qū),程序運(yùn)行結(jié)束就釋放。在程序執(zhí)行過(guò)程中它們占據(jù)固定的存儲(chǔ)

27、單元,而不動(dòng)態(tài)地進(jìn)行分配和釋放;動(dòng)態(tài)存儲(chǔ)區(qū)存放以下數(shù)據(jù):1) 函數(shù)形式參數(shù);2)自動(dòng)變量(未加static聲明的局部變量);3) 函數(shù)調(diào)用時(shí)的現(xiàn)場(chǎng)保護(hù)和返回地址;對(duì)以上這些數(shù)據(jù),在函數(shù)開始調(diào)用時(shí)分配動(dòng)態(tài)存儲(chǔ)空間,函數(shù)結(jié)束時(shí)釋放這些空間。5.8 變量的存儲(chǔ)類別5.8.2 動(dòng)態(tài)存儲(chǔ) 【例5.10】動(dòng)態(tài)存儲(chǔ)舉例 /* 源文件名:Li5_10.c 功能:測(cè)試動(dòng)態(tài)存儲(chǔ)變量的空間分配情況 */#include stdio.hvoid test()int m=10;m+;printf(m=%dn,m);5.8 變量的存儲(chǔ)類別 5.8.2 動(dòng)態(tài)存儲(chǔ)void main()printf(the first tim

28、e :);test();printf(the second time :);test();printf(the third time :);test();5.8 變量的存儲(chǔ)類別 5.8.2 動(dòng)態(tài)存儲(chǔ)編譯、連接、和運(yùn)行程序。程序運(yùn)行后,屏幕顯示:5.8 變量的存儲(chǔ)類別 5.8.2 動(dòng)態(tài)存儲(chǔ)函數(shù)中的局部變量,如不特別聲明為static存儲(chǔ)類別,都是動(dòng)態(tài)地分配存儲(chǔ)空間的,數(shù)據(jù)存儲(chǔ)在動(dòng)態(tài)存儲(chǔ)區(qū)中。函數(shù)中的形參和在函數(shù)中定義的變量(包括在復(fù)合語(yǔ)句中定義的變量)都屬此類,在調(diào)用該函數(shù)時(shí)系統(tǒng)會(huì)給它們分配存儲(chǔ)空間,在函數(shù)調(diào)用結(jié)束時(shí)就自動(dòng)釋放這些存儲(chǔ)空間。這類局部變量稱為自動(dòng)變量。自動(dòng)變量用關(guān)鍵字auto(au

29、to可以省略)作存儲(chǔ)類別的聲明。5.8 變量的存儲(chǔ)類別 5.8.2 動(dòng)態(tài)存儲(chǔ)如例5.10中,test函數(shù)中的m沒(méi)有用static聲明,說(shuō)明它就是一個(gè)自動(dòng)變量,所以,在主函數(shù)中調(diào)用了三次的test函數(shù),每次得到的m的輸出值都是一樣的,這是因?yàn)樽詣?dòng)變量只有在函數(shù)被調(diào)用的時(shí)候分配空間,當(dāng)函數(shù)調(diào)用結(jié)束,空間也就自動(dòng)釋放了,所以每次調(diào)用m都是被重新賦初始值10。5.8 變量的存儲(chǔ)類別5.8.3 用static聲明的局部變量 【例5.11】靜態(tài)局部變量例題 /*源文件名:Li5_11.c功能:測(cè)試靜態(tài)局部變量的空間分配情況 */#include stdio.hvoid test()static int m

30、=10; /定義m為靜態(tài)局部變量m+;printf(m=%dn,m);5.8 變量的存儲(chǔ)類別 5.8.3 用static聲明的局部變量void main()printf(the first time :);test();printf(the second time :);test();printf(the third time :);test();5.8 變量的存儲(chǔ)類別 5.8.3 用static聲明的局部變量有時(shí)希望函數(shù)中的局部變量的值在函數(shù)調(diào)用結(jié)束后不消失而保留原值,這時(shí)就應(yīng)該指定局部變量為“靜態(tài)局部變量”,用關(guān)鍵字static進(jìn)行聲明。如例6.11中test函數(shù)中的m變量被用static

31、聲明位靜態(tài)局部變量。由于靜態(tài)變量在程序運(yùn)行期間的被分配的存儲(chǔ)空間是固定的。所以第一次調(diào)用test函數(shù)的時(shí)候,m變量空間被分配,并且賦予初值10,然后執(zhí)行m+操作,所以m的值就為11.但調(diào)用結(jié)束的時(shí)候m的空間仍然存在,沒(méi)有因函數(shù)調(diào)用結(jié)束而被釋放。所以在test函數(shù)第二次被調(diào)用的時(shí)候,m不再重新分配空間和初始化為10,而是使用原來(lái)的空間,沿用上一次的值11,故第二次調(diào)用的時(shí)候輸出的m值為12,第三次為13。5.8 變量的存儲(chǔ)類別 5.8.3 用static聲明的局部變量對(duì)靜態(tài)局部變量的說(shuō)明:(1)靜態(tài)局部變量屬于靜態(tài)存儲(chǔ)類別,在靜態(tài)存儲(chǔ)區(qū)內(nèi)分配存儲(chǔ)單元。在程序整個(gè)運(yùn)行期間都不釋放。而自動(dòng)變量(即動(dòng)

32、態(tài)局部變量)屬于動(dòng)態(tài)存儲(chǔ)類別,占動(dòng)態(tài)存儲(chǔ)空間,函數(shù)調(diào)用結(jié)束后即釋放。(2)靜態(tài)局部變量在編譯時(shí)賦初值,即只賦初值一次;而對(duì)自動(dòng)變量賦初值是在函數(shù)調(diào)用時(shí)進(jìn)行,每調(diào)用一次函數(shù)重新給一次初值,相當(dāng)于執(zhí)行一次賦值語(yǔ)句。(3)如果在定義局部變量時(shí)不賦初值的話,則對(duì)靜態(tài)局部變量來(lái)說(shuō),編譯時(shí)自動(dòng)賦初值0(對(duì)數(shù)值型變量)或空字符(對(duì)字符變量)。而對(duì)自動(dòng)變量來(lái)說(shuō),如果不賦初值則它的值是一個(gè)不確定的值。5.8 變量的存儲(chǔ)類別為了提高效率,C語(yǔ)言允許將局部變量的值放在CPU的寄存器中,這種變量叫“寄存器變量”,用關(guān)鍵字register作聲明。5.8.4 register變量 /* 源文件名:Li5_12.c 功能:

33、測(cè)試寄存器存儲(chǔ)變量的空間分配情況*/#include stdio.hint factor(int n)register int i,f=1; for(i=1;i=n;i+)f=f*i; return f;5.8 變量的存儲(chǔ)類別 5.8.4 register變量void main()int i; for(i=0;i=5;i+) printf(%d!=%dn,i,factor(i);5.8 變量的存儲(chǔ)類別 5.8.4 register變量編譯、連接、和運(yùn)行程序。程序運(yùn)行后,屏幕顯示:5.8 變量的存儲(chǔ)類別 5.8.4 register變量注意: (1)只有局部動(dòng)態(tài)變量和形式參數(shù)可以作為寄存器變量;

34、 (2)一個(gè)計(jì)算機(jī)系統(tǒng)中的寄存器數(shù)目有限,不能定義任意多個(gè)寄存器變量; (3)局部靜態(tài)變量不能定義為寄存器變量; (4)register型變量不能為long, double, float型。5.8 變量的存儲(chǔ)類別前面介紹過(guò),在函數(shù)外部定義的變量稱為外部變量。如果一個(gè)程序由多個(gè)源文件構(gòu)成,根據(jù)某個(gè)源文件中定義的外部變量能否被其它源文件中的函數(shù)所引用,將外部變量分為兩個(gè)作用域級(jí)別:(1)文件級(jí)外部變量只允許被本源文件中的函數(shù)引用,其定義方式如下:static 數(shù)據(jù)類型 外部變量表;(2)程序級(jí)外部變量允許被程序中各源文件內(nèi)的函數(shù)引用,其定義方式如下: extern 數(shù)據(jù)類型 外部變量表;5.8.5

35、 文件級(jí)外部變量和程序級(jí)外部變量5.8 變量的存儲(chǔ)類別 5.8.5 文件級(jí)外部變量和程序級(jí)外部變同一程序中的其它源文件內(nèi)的函數(shù)如果想引用程序級(jí)外部變量時(shí),需要對(duì)其進(jìn)行說(shuō)明。有效范圍:從定義變量的位置開始到本源文件結(jié)束,及有extern說(shuō)明的其它源文件。注意:(1)extern不是變量定義,但可擴(kuò)展外部變量作用域。(2)若外部變量與局部變量同名,則外部變量被屏蔽。5.8 變量的存儲(chǔ)類別 5.8.5 文件級(jí)外部變量和程序級(jí)外部變下面用圖表對(duì)變量的存儲(chǔ)類型進(jìn)行一個(gè)系統(tǒng)的歸納:5.9 編譯預(yù)處理在前面各章中,已多次使用過(guò)以“#”開頭的預(yù)處理命令。如包含命令#include,宏定義命令#define等。

36、在源程序中這些命令都放在函數(shù)之外,而且一般都放在源文件的前面,它們稱為編譯預(yù)處理部分。所謂編譯預(yù)處理是指在進(jìn)行編譯的第一遍掃描(詞法掃描和語(yǔ)法分析)之前所作的工作。預(yù)處理是語(yǔ)言的一個(gè)重要功能,它由預(yù)處理程序負(fù)責(zé)完成。當(dāng)對(duì)一個(gè)源文件進(jìn)行編譯時(shí),系統(tǒng)將自動(dòng)引用預(yù)處理程序?qū)υ闯绦蛑械念A(yù)處理部分作處理,處理完畢自動(dòng)進(jìn)入對(duì)源程序的編譯。語(yǔ)言提供了多種預(yù)處理功能,如宏定義、文件包含、條件編譯等。合理地使用預(yù)處理功能編寫的程序便于閱讀、修改、移植和調(diào)試,也有利于模塊化程序設(shè)計(jì)。本節(jié)主要介紹常用的幾種預(yù)處理功能。.8 變量的存儲(chǔ)類別文件包含由#include 命令來(lái)說(shuō)明,編譯預(yù)處理時(shí),系統(tǒng)將包含文件的內(nèi)容插入

37、到程序中引用它的地方,即程序中相應(yīng)的#include命令所在處.文件包含是指一個(gè)源文件可以將另一個(gè)源文件的全部?jī)?nèi)容包含進(jìn)來(lái).有兩種形式:#include 和#include ”文件名”。1) 每行寫一句,只能寫一個(gè)文件名,結(jié)尾不加分號(hào);。被包含的文件必須是源文件而不能是目標(biāo)文件。 2) 一個(gè)include命令只能指定一個(gè)被包含文件,若有多個(gè)文件要包含,則需用多個(gè)include命令。5.9.1 #include命令5.9 編譯預(yù)處理 5.9.1 #include 命令3) 文件包含可以嵌套。 即一個(gè)被包含文件中,可以包含另一個(gè)被包含文件。4) 在#include命令中,文件名可以用尖括號(hào)或雙引號(hào)

38、括起來(lái),二者都是合法的。其區(qū)別是用尖括號(hào)時(shí),系統(tǒng)到存放C庫(kù)函數(shù)頭文件所在的目錄中去尋找要包含的文件。用雙引號(hào)時(shí),系統(tǒng)先在用戶當(dāng)前目錄中尋找要包含的文件,若找不到,再按標(biāo)準(zhǔn)方式查找。在程序設(shè)計(jì)中,文件包含是很有用的。一個(gè)大的程序可以分為多個(gè)模塊,由多個(gè)程序員分別編程。有些公用的符號(hào)常量或宏定義等可單獨(dú)組成一個(gè)文件,在其它文件的開頭用包含命令包含該文件即可使用。這樣可避免在每個(gè)文件開頭都去書寫那些公用量,從而節(jié)省時(shí)間,并減少出錯(cuò)。在語(yǔ)言源程序中允許用一個(gè)標(biāo)識(shí)符來(lái)表示一個(gè)字符串,稱為”宏”。被定義為“宏”的標(biāo)識(shí)符稱為”宏名”。在編譯預(yù)處理時(shí),對(duì)程序中所有出現(xiàn)的”宏名”,都用宏定義中的字符串去代換,這

39、稱為”宏代換”或”宏展開”。宏定義是由源程序中的宏定義命令完成的,宏代換是由預(yù)處理程序自動(dòng)完成的。在語(yǔ)言中,”宏”分為有參數(shù)和無(wú)參數(shù)的兩種。下面分別討論這兩種“宏”的定義和調(diào)用。5.9.2 宏定義5.9 編譯預(yù)處理5.9 編譯預(yù)處理 5.9.2 宏定義1無(wú)參宏定義無(wú)參宏的宏名后不帶參數(shù)。其定義的一般形式為:#define 標(biāo)識(shí)符 字符串其中的”#”表示這是一條預(yù)處理命令,凡是以”#”開頭的均為預(yù)處理命令,”define”為宏定義命令,”標(biāo)識(shí)符”為所定義的宏名,”字符串”可以是常數(shù)、表達(dá)式、格式串等。5.9 編譯預(yù)處理 5.9.2 宏定義【例6.13】不帶參數(shù)的宏的使用舉例/*源文件名:Li6_

40、13.c功能:利用無(wú)參宏求圓的周長(zhǎng)和面積*/#include stdio.h#define PI 3.1415926void main( )double r, circle, area;printf(nPlease input radius: );scanf(%lf,&r);circle = 2 * PI * r;area = PI * r * r;printf(ncircle=%lf,area=%lfn,circle, area);5.9 編譯預(yù)處理 5.9.2 宏定義編譯、連接、運(yùn)行程序。程序運(yùn)行后,屏幕顯示:5.9 編譯預(yù)處理 5.9.2 宏定義使用中應(yīng)注意下面幾點(diǎn):(1) 習(xí)慣上宏名一

41、般用大寫字母表示;(2) 宏定義不是C語(yǔ)句,書寫時(shí)行末不應(yīng)加分號(hào);(3) 在進(jìn)行宏定義時(shí),可以引用已定義的宏名;(4) 當(dāng)宏體是表達(dá)式時(shí),為穩(wěn)妥起見(jiàn)常將它用括弧括起來(lái); (5) 宏名在源程序中若用引號(hào)括起來(lái),則預(yù)處理程序不對(duì)其作宏代換。5.9 編譯預(yù)處理 5.9.2 宏定義上例中定義宏名OK表示100,但在printf語(yǔ)句中OK被引號(hào)括起來(lái),因此不作宏代換。程序的運(yùn)行結(jié)果為:OK 而不是100.這表示把”O(jiān)K”當(dāng)字符串處理。#include ”stdio.h”#define OK 100void main() printf(OK); printf(n);5.9 編譯預(yù)處理 5.9.2 宏定義(

42、6) 若宏名字出現(xiàn)在標(biāo)識(shí)符內(nèi),則預(yù)處理時(shí)它也不被替換。(7) 同一個(gè)宏名可以重復(fù)定義,如果不一致,編譯時(shí)會(huì)發(fā)出警告,并以最后一次定義為準(zhǔn)。(8) 當(dāng)宏定義在一行中寫不下時(shí),可在行尾用反斜杠“”進(jìn)行續(xù)行。(9) 宏定義通常放在源程序文件的開頭,其作用域是整個(gè)源程序.也可以在函數(shù)內(nèi)部作宏定義,這時(shí)宏名字的作用域只在本函數(shù).可用#undef終止宏定義的作用域。5.9 編譯預(yù)處理 5.9.2 宏定義(10) 與變量定義不同,宏定義只作字符替換,不分配內(nèi)存空間,也不做正確性檢查。(11) 宏定義時(shí)可以不包含宏體,即寫成:#define 宏名這種寫法也是合法的,此時(shí)僅說(shuō)明宏名已被定義。5.9 編譯預(yù)處理

43、5.9.2 宏定義2帶參宏定義語(yǔ)言允許宏帶有參數(shù)。在宏定義中的參數(shù)稱為形式參數(shù),在宏調(diào)用中的參數(shù)稱為實(shí)際參數(shù)。對(duì)帶參數(shù)的宏,在調(diào)用中,不僅要宏展開,而且要用實(shí)參去代換形參。帶參宏定義的一般形式為:#define 宏名(形參表) 字符串 在字符串中含有各個(gè)形參。帶參宏調(diào)用的一般形式為:宏名(實(shí)參表);5.9 編譯預(yù)處理 5.9.2 宏定義 【例5.14】帶參數(shù)的宏的使用舉例 /* 源文件名:Li6_14.c 功能:利用有參宏求兩個(gè)數(shù)中的最大值 */#include stdio.h#define MAX(a,b) (ab)?a:bvoid main()int x,y,max;printf(inpu

44、t two numbers: );scanf(%d%d,&x,&y);max=MAX(x,y);printf(max=%dn,max); 5.9 編譯預(yù)處理 5.9.2 宏定義例5.14中的的第二行進(jìn)行帶參宏定義,用宏名MAX表示條件表達(dá)式(ab)?a:b,形參a,b均出現(xiàn)在條件表達(dá)式中。程序中語(yǔ)句max=MAX(x,y)為宏調(diào)用,實(shí)參x,y,將代換形參a,b。宏展開后該語(yǔ)句為:max=(xy)?x:y;用于計(jì)算x,y中的大數(shù)。編譯、連接、和運(yùn)行程序。程序運(yùn)行后,屏幕顯示:5.9 編譯預(yù)處理 5.9.2 宏定義對(duì)于帶參的宏定義有以下問(wèn)題需要說(shuō)明:(1)帶參宏定義中,宏名和形參表之間不能有空格出

45、現(xiàn)。例如把#define MAX(a,b) (ab)?a:b寫為:#define MAX (a,b) (ab)?a:b將被認(rèn)為是無(wú)參宏定義,宏名MAX代表字符串 (a,b) (ab)?a:b。宏展開時(shí),宏調(diào)用語(yǔ)句:max=MAX(x,y);將變?yōu)閙ax=(a,b)(ab)?a:b(x,y);這顯然是錯(cuò)誤的。5.9 編譯預(yù)處理 5.9.2 宏定義(2) 在帶參宏定義中,形式參數(shù)不分配內(nèi)存單元,因此不必作類型定義。而宏調(diào)用中的實(shí)參有具體的值。要用它們?nèi)ゴ鷵Q形參,因此必須作類型說(shuō)明。這是與函數(shù)中的情況不同的。在函數(shù)中,形參和實(shí)參是兩個(gè)不同的量,各有自己的作用域,調(diào)用時(shí)要把實(shí)參值賦予形參,進(jìn)行”值傳遞

46、”。而在帶參宏中,只是符號(hào)代換,不存在值傳遞的問(wèn)題。(3) 在宏定義中的形參是標(biāo)識(shí)符,而宏調(diào)用中的實(shí)參可以是表達(dá)式。5.9 編譯預(yù)處理 5.9.2 宏定義 【例6.15】用宏來(lái)實(shí)現(xiàn)平方 /* 源文件名:Li6_15.c 功能:利用有參宏求數(shù)的平方 */#include stdio.h#define TEST(y) (y)*(y) /*用宏來(lái)實(shí)現(xiàn)平方*/void main()int a,test;printf(input a number: );scanf(%d,&a);test=TEST(a+1);printf(test=%dn,test); 5.9 編譯預(yù)處理 5.9.2 宏定義上例中第二行

47、為宏定義,形參為y。語(yǔ)句test=TEST(a+1);宏調(diào)用中實(shí)參為a+1,是一個(gè)表達(dá)式,在宏展開時(shí),用a+1代換y,再用(y)*(y) 代換TEST,得到如下語(yǔ)句:test=(a+1)*(a+1);這與函數(shù)的調(diào)用是不同的,函數(shù)調(diào)用時(shí)要把實(shí)參表達(dá)式的值求出來(lái)再賦予形參。而宏代換中對(duì)實(shí)參表達(dá)式不作計(jì)算直接原樣替換。編譯、連接、和運(yùn)行程序。程序運(yùn)行后,屏幕顯示:5.9 編譯預(yù)處理 5.9.2 宏定義(4)在宏定義中,字符串內(nèi)的形參通常要用括號(hào)括起來(lái)以避免出錯(cuò)。在上例中的宏定義中(y)*(y)表達(dá)式的y都用括號(hào)括起來(lái),因此結(jié)果是正確的。如果去掉括號(hào),把程序改為以下形式: 【例5.16】在帶參數(shù)宏的定

48、義中不使用括號(hào) /* 源文件名:Li5_16.c 功能:說(shuō)明有參宏中括號(hào)的重要性 */#include stdio.h#define TEST(y) y*yvoid main()int a,test;printf(input a number: );scanf(%d,&a);test=TEST(a+1);printf(test=%dn,test);5.9 編譯預(yù)處理 5.9.2 宏定義同樣輸入3,但結(jié)果卻是不一樣的。問(wèn)題在哪里呢? 這是由于代換只作符號(hào)代換而不作其它處理而造成的。宏代換后將得到以下語(yǔ)句:test=a+1*a+1;由于a為3故test的值為5。這顯然與題意相違,因此參數(shù)兩邊的括號(hào)

49、是不能少的。即使在參數(shù)兩邊加括號(hào)還是不夠的,請(qǐng)看下面程序:編譯、連接、和運(yùn)行程序。程序運(yùn)行后,屏幕顯示:5.9 編譯預(yù)處理 5.9.2 宏定義 【例5.17】在宏定義的參數(shù)兩邊加括號(hào) /* 源文件名:Li6_17.c 功能:說(shuō)明有參宏中括號(hào)的重要性 */#include stdio.h#define TEST(y) (y)*(y) /*用宏來(lái)實(shí)現(xiàn)平方*/void main()int a,test;printf(input a number: );scanf(%d,&a);test=160/TEST(a+1);printf(test=%dn,test); 5.9 編譯預(yù)處理 5.9.2 宏定義本

50、程序與前例相比,只把宏調(diào)用語(yǔ)句改為:test=160/TEST(a+1);運(yùn)行本程序如輸入值仍為3時(shí),希望結(jié)果為10。但實(shí)際運(yùn)行的結(jié)果如下:5.9 編譯預(yù)處理 5.9.2 宏定義為什么會(huì)得到這樣的結(jié)果呢?分析宏調(diào)用語(yǔ)句,在宏代換之后變?yōu)椋簍est=160/(a+1)*(a+1);a為3時(shí),由于“/”和“*”運(yùn)算符優(yōu)先級(jí)和結(jié)合性相同,則先作160/(3+1)得40,再作40*(3+1)最后得160。5.9 編譯預(yù)處理 5.9.2 宏定義 【例5.18】在宏定義的整個(gè)字符串外加括號(hào) /* 源文件名:Li5_18.c 功能:說(shuō)明有參宏中括號(hào)的重要性 */#include stdio.h#define

51、 TEST(y) (y)*(y) /*用宏來(lái)實(shí)現(xiàn)平方*/void main()int a,test;printf(input a number: );scanf(%d,&a);test=160/TEST(a+1);printf(test=%dn,test); 5.9 編譯預(yù)處理 5.9.2 宏定義以上討論說(shuō)明,對(duì)于宏定義不僅應(yīng)在參數(shù)兩側(cè)加括號(hào),也應(yīng)在整個(gè)字符串外加括號(hào)。編譯、連接、和運(yùn)行程序。程序運(yùn)行后,屏幕顯示:5.9 編譯預(yù)處理 5.9.2 宏定義(5)帶參的宏和帶參函數(shù)很相似,但有本質(zhì)上的不同,除上面已談到的各點(diǎn)外,把同一表達(dá)式用函數(shù)處理與用宏處理兩者的結(jié)果有可能是不同的。 【例5.19

52、】用帶參數(shù)的函數(shù)求某個(gè)數(shù)的平方 /* 源文件名:Li6_19.c 功能:利用帶參數(shù)的函數(shù)求平方*/#include ”stdio.h”void main() int i=1; while(i=5) printf(%dn,test(i+);5.9 編譯預(yù)處理 5.9.2 宏定義編譯、連接、運(yùn)行程序。程序運(yùn)行后,屏幕顯示:test(int y) return(y)*(y);5.9 編譯預(yù)處理 5.9.2 宏定義 【例5.20】帶參數(shù)的宏求平方 /* 源文件名:Li5_20.c 功能:利用帶參數(shù)的宏求平方 */#include ” stdio.h”#define TEST(y) (y)*(y)void main()int i=1;while

溫馨提示

  • 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)論