第4章函數(shù)公開課一等獎(jiǎng)優(yōu)質(zhì)課大賽微課獲獎(jiǎng)?wù)n件_第1頁(yè)
第4章函數(shù)公開課一等獎(jiǎng)優(yōu)質(zhì)課大賽微課獲獎(jiǎng)?wù)n件_第2頁(yè)
第4章函數(shù)公開課一等獎(jiǎng)優(yōu)質(zhì)課大賽微課獲獎(jiǎng)?wù)n件_第3頁(yè)
第4章函數(shù)公開課一等獎(jiǎng)優(yōu)質(zhì)課大賽微課獲獎(jiǎng)?wù)n件_第4頁(yè)
第4章函數(shù)公開課一等獎(jiǎng)優(yōu)質(zhì)課大賽微課獲獎(jiǎng)?wù)n件_第5頁(yè)
已閱讀5頁(yè),還剩52頁(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)介

第4章函

數(shù)C語(yǔ)言是通過(guò)函數(shù)來(lái)實(shí)現(xiàn)模塊化程序設(shè)計(jì)。因此較大C語(yǔ)言應(yīng)用程序,往往是由多個(gè)函數(shù)構(gòu)成,每個(gè)函數(shù)分別相應(yīng)各自功效模塊。函數(shù)定義與調(diào)用函數(shù)嵌套調(diào)用與遞歸調(diào)用內(nèi)部變量與外部變量?jī)?nèi)部函數(shù)與外部函數(shù)變量動(dòng)態(tài)存儲(chǔ)與靜態(tài)存儲(chǔ)

第1頁(yè)第1頁(yè)函數(shù)定義與調(diào)用函數(shù)定義函數(shù)返回值與函數(shù)類型對(duì)被調(diào)用函數(shù)闡明和函數(shù)原型函數(shù)調(diào)用函數(shù)形參與實(shí)參

第2頁(yè)第2頁(yè)函數(shù)定義1.任何函數(shù)(包括主函數(shù)main())都是由函數(shù)闡明和函數(shù)體兩部分構(gòu)成。依據(jù)函數(shù)是否需要參數(shù),可將函數(shù)分為無(wú)參函數(shù)和有參函數(shù)兩種。(1)無(wú)參函數(shù)普通形式函數(shù)類型函數(shù)名(void){

闡明語(yǔ)句部分;可執(zhí)行語(yǔ)句部分;}如:intfunc(){……}注意:在舊原則中,函數(shù)能夠缺省參數(shù)表。但在新原則中,函數(shù)不可缺省參數(shù)表;假如不需要參數(shù),則用“void”表示,主函數(shù)main()例外。第3頁(yè)第3頁(yè)voidfunc(){ printf("**********\n"); printf("printedinfunc\n"); printf("***********\n");}main(){ func(); printf("thisisprintedinmain\n");}例程func0_b.c第4頁(yè)第4頁(yè)(2)有參函數(shù)普通形式函數(shù)類型函數(shù)名(數(shù)據(jù)類型參數(shù)[,數(shù)據(jù)類型參數(shù)2……]){ 闡明語(yǔ)句部分; 可執(zhí)行語(yǔ)句部分;}例:intfunc(inta,intb){…..}有參函數(shù)比無(wú)參函數(shù)多了一個(gè)參數(shù)表。調(diào)用有參函數(shù)時(shí),調(diào)用函數(shù)將賦予這些參數(shù)實(shí)際值。為了與調(diào)用函數(shù)提供實(shí)際參數(shù)區(qū)別開,將函數(shù)定義中參數(shù)表稱為形式參數(shù)表,簡(jiǎn)稱形參表。第5頁(yè)第5頁(yè)intadd(intx,inty){ intsum; sum=x+y; returnsum;}main(){ inta,b,c; scanf("%d,%d",&a,&b); c=add(a,b); printf("%d+%d=%d\n",a,b,c);}例程func_b.c第6頁(yè)第6頁(yè)[案例]定義一個(gè)函數(shù),用于求兩個(gè)數(shù)中較大數(shù)。/*功效:定義一個(gè)求較大數(shù)函數(shù)并在主函數(shù)中調(diào)用*/intmax(intn1,intn2){ return(n1>n2?n1:n2);}main(){ intmax(intn1,intn2); /*函數(shù)闡明*/intnum1,num2;printf("inputtwonumbers:\n");scanf("%d,%d",&num1,&num2); printf("max=%d\n",max(num1,num2));getchar();/*使程序暫停,按任一鍵繼續(xù)*/}例程func.c第7頁(yè)第7頁(yè)2.闡明(1)函數(shù)定義不允許嵌套。在C語(yǔ)言中,所有函數(shù)(包括主函數(shù)main())都是平行。一個(gè)函數(shù)定義,能夠放在程序中任意位置,主函數(shù)main()之前或之后。但在一個(gè)函數(shù)函數(shù)體內(nèi),不能再定義另一個(gè)函數(shù),即不能嵌套定義。(2)空函數(shù):既無(wú)參數(shù)、函數(shù)體又為空函數(shù)。其普通形式為:

[函數(shù)類型]函數(shù)名(void){ }(3)在老版本C語(yǔ)言中,參數(shù)類型闡明允許放在函數(shù)闡明部分第2行單獨(dú)指定。

intmax(x,y)intx,y;{ …}例程func9.c第8頁(yè)第8頁(yè)函數(shù)形參與實(shí)參及程序執(zhí)行順序函數(shù)參數(shù)分為形參和實(shí)參兩種,作用是實(shí)現(xiàn)數(shù)據(jù)傳送。形參出現(xiàn)在函數(shù)定義中,只能在該函數(shù)體內(nèi)使用。發(fā)生函數(shù)調(diào)用時(shí),調(diào)用函數(shù)把實(shí)參值復(fù)制1份,傳送給被調(diào)用函數(shù)形參,從而實(shí)現(xiàn)調(diào)用函數(shù)向被調(diào)用函數(shù)數(shù)據(jù)傳送。

[案例3]

實(shí)參對(duì)形參數(shù)據(jù)傳遞。(注意執(zhí)行順序)第9頁(yè)第9頁(yè)voidmain(){ voids(intn);/*闡明函數(shù)*/intn=100;/*定義實(shí)參n,并初始化*/s(n);/*調(diào)用函數(shù)*//*輸出調(diào)用后實(shí)參值,便于進(jìn)行比較*/ printf("n_first=%d\n",n);}voids(intn){ inti;printf("n_begin=%d\n",n);/*輸出改變前形參值*/for(i=n-1;i>=1;i--)n=n+i;/*改變形參值*/printf("n_end=%d\n",n);/*輸出改變后形參值*/}例程func2.c第10頁(yè)第10頁(yè)說(shuō)明:(1)實(shí)參能夠是常量、變量、表示式、函數(shù)等。不論實(shí)參是何種類型量,在進(jìn)行函數(shù)調(diào)用時(shí),它們都必須含有確定值,方便把這些值傳送給形參。 因此,應(yīng)預(yù)先用賦值、輸入等方法,使實(shí)參取得確定值。(2)形參變量只有在被調(diào)用時(shí),才分派內(nèi)存單元;調(diào)用結(jié)束時(shí),即刻釋放所分派內(nèi)存單元。 因此,形參只有在該函數(shù)內(nèi)有效。調(diào)用結(jié)束,返回調(diào)用函數(shù)后,則不能再使用該形參變量。(3)實(shí)參對(duì)形參數(shù)據(jù)傳送是單向,即只能把實(shí)參值傳送給形參,而不能把形參值反向地傳送給實(shí)參。(4)實(shí)參和形參占用不同內(nèi)存單元,即使同名也互不影響。第11頁(yè)第11頁(yè)函數(shù)返回值與函數(shù)類型C語(yǔ)言函數(shù)兼有其它語(yǔ)言中函數(shù)和過(guò)程兩種功效,從這個(gè)角度看,又可把函數(shù)分為有返回值函數(shù)和無(wú)返回值函數(shù)兩種。1.函數(shù)返回值與return語(yǔ)句有參函數(shù)返回值,是通過(guò)函數(shù)中return語(yǔ)句來(lái)取得。(1)return語(yǔ)句普通格式:return(返回值表示式); (2)return語(yǔ)句功效:返回調(diào)用函數(shù),并將“返回值表示式”值帶給調(diào)用函數(shù)。注意:調(diào)用函數(shù)中無(wú)return語(yǔ)句,并不是不返回一個(gè)值,而是一個(gè)不擬定值。為了明確表示不返回值,能夠用“void”定義成“無(wú)(空)類型”。第12頁(yè)第12頁(yè)2.函數(shù)類型在定義函數(shù)時(shí),對(duì)函數(shù)類型闡明,應(yīng)與return語(yǔ)句中、返回值表示式類型一致。假如不一致,則以函數(shù)類型為準(zhǔn)。假如缺省函數(shù)類型,則系統(tǒng)一律按整型處理。良好程序設(shè)計(jì)習(xí)慣:為了使程序含有良好可讀性并減少犯錯(cuò),凡不要求返回值函數(shù)都應(yīng)定義為空類型;即使函數(shù)類型為整型,也不使用系統(tǒng)缺省處理。第13頁(yè)第13頁(yè)對(duì)被調(diào)用函數(shù)闡明和函數(shù)原型在ANSIC新原則中,采用函數(shù)原型方式,對(duì)被調(diào)用函數(shù)進(jìn)行闡明,其普通格式下列:函數(shù)類型函數(shù)名(數(shù)據(jù)類型[參數(shù)名][,數(shù)據(jù)類型[參數(shù)名2]…]);C語(yǔ)言同時(shí)又要求,在下列幾種情況下,能夠省去對(duì)被調(diào)用函數(shù)闡明:(1)當(dāng)被調(diào)用函數(shù)函數(shù)定義出現(xiàn)在調(diào)用函數(shù)之前時(shí)。由于在調(diào)用之前,編譯系統(tǒng)已經(jīng)知道了被調(diào)用函數(shù)函數(shù)類型、參數(shù)個(gè)數(shù)、類型和順序。(2)假如在所有函數(shù)定義之前,在函數(shù)外部(比如文獻(xiàn)開始處)預(yù)先對(duì)各個(gè)函數(shù)進(jìn)行了闡明,則在調(diào)用函數(shù)中可缺省對(duì)被調(diào)用函數(shù)闡明。(3)假如被調(diào)函數(shù)返回值是整型或字符型時(shí),能夠不對(duì)被調(diào)函數(shù)作闡明,而直接調(diào)用。這時(shí)系統(tǒng)將自動(dòng)對(duì)被調(diào)函數(shù)返回值按整型處理。(4)對(duì)庫(kù)函數(shù)調(diào)用不需要再作闡明,但必須把該函數(shù)頭文獻(xiàn)用include命令包括在源文獻(xiàn)前部。例程func8.c第14頁(yè)第14頁(yè)函數(shù)調(diào)用C語(yǔ)言中,函數(shù)調(diào)用普通形式為:函數(shù)名([實(shí)際參數(shù)表])切記:實(shí)參個(gè)數(shù)、類型和順序,應(yīng)當(dāng)與被調(diào)用函數(shù)所要求參數(shù)個(gè)數(shù)、類型和順序一致,才干正確地進(jìn)行數(shù)據(jù)傳遞。在C語(yǔ)言中,能夠用下列幾種方式調(diào)用函數(shù):(1)函數(shù)表示式:函數(shù)作為表示式一項(xiàng),出現(xiàn)在表示式中,以函數(shù)返回值參與表示式運(yùn)算。這種方式要求函數(shù)是有返回值。(2)函數(shù)語(yǔ)句:C語(yǔ)言中函數(shù)能夠只進(jìn)行一些操作而不返回函數(shù)值,這時(shí)函數(shù)調(diào)用可作為一條獨(dú)立語(yǔ)句。(3)函數(shù)實(shí)參:函數(shù)作為另一個(gè)函數(shù)調(diào)用實(shí)際參數(shù)出現(xiàn)。這種情況是把該函數(shù)返回值作為實(shí)參進(jìn)行傳送,因此要求該函數(shù)必須是有返回值。第15頁(yè)第15頁(yè)闡明:(1)調(diào)用函數(shù)時(shí),函數(shù)名稱必須與含有該功效自定義函數(shù)名稱完全一致。(2)實(shí)參在類型上按順序與形參,必須一一相應(yīng)和匹配。假如類型不匹配,C編譯程序?qū)促x值兼容規(guī)則進(jìn)行轉(zhuǎn)換。假如實(shí)參和形參類型不賦值兼容,通常并不給出犯錯(cuò)信息,且程序仍然繼續(xù)執(zhí)行,只是得不到正確結(jié)果。(3)假如實(shí)參表中包括多個(gè)參數(shù),對(duì)實(shí)參求值順序隨系統(tǒng)而異。有系統(tǒng)按自左向右順序求實(shí)參值,有系統(tǒng)則相反。TurboC和MSC是按自右向左順序進(jìn)行。第16頁(yè)第16頁(yè)main(){ inti=0; printf("%d,%d,%d\n",i,i++,++i);}TC中,函數(shù)實(shí)參是從右向左求。例程func1.c第17頁(yè)第17頁(yè)函數(shù)嵌套調(diào)用和遞歸調(diào)用 函數(shù)嵌套調(diào)用是指,在執(zhí)行被調(diào)用函數(shù)時(shí),被調(diào)用函數(shù)又調(diào)用了其它函數(shù)。這與其它語(yǔ)言子程序嵌套調(diào)用情形是類似,其關(guān)系可表示如圖4-2。第18頁(yè)第18頁(yè)[例]計(jì)算s=1k+2k+3k+……+Nk

/*功效:函數(shù)嵌套調(diào)用*/

#defineK4

#defineN5

longf1(intn,intk) { /*計(jì)算nk次方*/

longpower=n;

inti;

for(i=1;i<k;i++)power*=n;

returnpower;

}

第19頁(yè)第19頁(yè)longf2(intn,intk){ /*計(jì)算1到nk次方之累加和*/ longsum=0; inti; for(i=1;i<=n;i++)sum+=f1(i,k);returnsum;}main(){ inttotal=0; printf("Sumof%dpowersofintegers from1to%d=",K,N);total=f2(N,K); printf(“%d\n”,total);/*printf("%d\n",f2(N,K));*/}例程func3.c第20頁(yè)第20頁(yè)嵌套調(diào)用執(zhí)行過(guò)程main(){inttotal=0;printf(“…”);total=f2(N,K);printf(total);}f2(n,k){longsum=0;inti;for(..)sum+=f1(i,k);returnsum;}f1(n,k){longpower=n;inti;for(..)power*=n;returnpower;}第21頁(yè)第21頁(yè)函數(shù)遞歸調(diào)用函數(shù)遞歸調(diào)用是指:一個(gè)函數(shù)在它函數(shù)體內(nèi),直接或間接地調(diào)用它本身。C語(yǔ)言允許函數(shù)遞歸調(diào)用。在遞歸調(diào)用中,調(diào)用函數(shù)又是被調(diào)用函數(shù),執(zhí)行遞歸函數(shù)將重復(fù)調(diào)用其本身。每調(diào)用一次就進(jìn)入新一層。為了預(yù)防遞歸調(diào)用無(wú)終止地進(jìn)行,必須在函數(shù)內(nèi)有終止遞歸調(diào)用手段。慣用辦法是加條件判斷,滿足某種條件后就不再作遞歸調(diào)用,然后逐層返回。第22頁(yè)第22頁(yè)遞歸舉例[例]編程計(jì)算n!。/*功效:通過(guò)函數(shù)遞歸調(diào)用計(jì)算階乘*//*基本思緒:n!=n*(n-1)!*/longpower(intn){ longf; if(n>1) f=power(n-1)*n; else f=1; return(f);}第23頁(yè)第23頁(yè)main(){ intn;longy;printf("inputainteagernumber:\n");scanf("%d",&n);y=power(n);printf("%d!=%ld\n",n,y);}例程func4.c第24頁(yè)第24頁(yè)遞歸執(zhí)行過(guò)程main(){…y=power(3);printf(y);}第一次調(diào)用power(3){…if(n>1)f=power(n-1)*n;elsef=1;return(f);}/*n=3*/第二次調(diào)用power(2){…if(n>1)f=power(n-1)*n;elsef=1;return(f);}/*n=2*/第二次調(diào)用power(1){…if(n>1)f=power(n-1)*n;elsef=1;return(f);}/*n=1*/第25頁(yè)第25頁(yè)變量作用域(局部變量與全局變量) C語(yǔ)言中全部變量都有自己作用域。變量說(shuō)明位置不同,其作用域也不同,據(jù)此將C語(yǔ)言中變量分為局部變量和全局變量。在一個(gè)函數(shù)內(nèi)部定義變量,只在本函數(shù)范圍內(nèi)有效,這么變量稱為本函數(shù)局部變量。定義在函數(shù)外部變量,該變量不屬于任何一個(gè)函數(shù),但可被本程序中其它函數(shù)所共用,它有效范圍是從定義開始到根源程序結(jié)束,該類變量稱為全局變量。第26頁(yè)第26頁(yè)說(shuō)出下面程序中變量類型及其作用域intp=1,q=5;

intf1(inta){

inti=2;a=a*i;printf("i=%d,a=%d,p=%d,q=%dinf1\n",i,a,p,q);}floatx=2.5,y=3;intf2(chara){

charb=‘B’;p=p+a;q=q+b;printf(“b=%c,a=%c,p=%d,q=%dinf2\n”,b,a,p,q);printf(”x=%6.2f,y=%6.2finf2\n“,x,y);}main(){

intk=6;f1(k);f2(‘A’);printf(“p=%d,q=%d,x=%6.2f,y=%6.2finmain\n”,p,q,x,y);}

例程func6.c第27頁(yè)第27頁(yè)關(guān)于局部變量作用域還要闡明下列幾點(diǎn):1.主函數(shù)main()中定義內(nèi)部變量,也只能在主函數(shù)中使用,其它函數(shù)不能使用。同時(shí),主函數(shù)中也不能使用其它函數(shù)中定義內(nèi)部變量。因?yàn)橹骱瘮?shù)也是一個(gè)函數(shù),與其它函數(shù)是平行關(guān)系。這一點(diǎn)是與其它語(yǔ)言不同,應(yīng)給予注意。2.形參變量也是內(nèi)部變量,屬于被調(diào)用函數(shù);實(shí)參變量,則是調(diào)用函數(shù)內(nèi)部變量。3.允許在不同函數(shù)中使用相同變量名,它們代表不同對(duì)象,分派不同單元,互不干擾,也不會(huì)發(fā)生混同。4.在復(fù)合語(yǔ)句中也可定義變量,其作用域只在復(fù)合語(yǔ)句范圍內(nèi)。(例程func6.c)第28頁(yè)第28頁(yè)變量存儲(chǔ)類型在C語(yǔ)言中,對(duì)變量存儲(chǔ)類型闡明有下列四種:自動(dòng)變量(auto)、存儲(chǔ)器變量(register)、外部變量(extern)、靜態(tài)變量(static)。這四種類型變量在程序運(yùn)營(yíng)期間依據(jù)所分派地址改變是否,又可分為動(dòng)態(tài)變量(自動(dòng)變量和存儲(chǔ)器變量)和靜態(tài)變量(外部變量和靜態(tài)內(nèi)部變量)。動(dòng)態(tài)存儲(chǔ)變量是指在程序運(yùn)營(yíng)中依據(jù)需要?jiǎng)討B(tài)分派存儲(chǔ)空間變量;靜態(tài)存儲(chǔ)變量指在程序運(yùn)營(yíng)中所分派存儲(chǔ)空間固定變量。第29頁(yè)第29頁(yè)變量存儲(chǔ)類型闡明局部變量存儲(chǔ)方式(1)不做專門闡明時(shí)默認(rèn)為auto型:該類型變量位于動(dòng)態(tài)存儲(chǔ)區(qū),離開函數(shù)其值就消失。(2)用static闡明局部靜態(tài)變量:該類型變量位于靜態(tài)存儲(chǔ)區(qū),默認(rèn)初始值為0,該類變量,離開函數(shù)它們值仍保留,直到程序結(jié)束。(3)用register闡明變量:位于cpu存儲(chǔ)器中,能夠提升執(zhí)行效率,離開函數(shù)其值就消失。

第30頁(yè)第30頁(yè)內(nèi)部變量存儲(chǔ)方式1.靜態(tài)存儲(chǔ)──靜態(tài)內(nèi)部變量(1)定義格式:static數(shù)據(jù)類型內(nèi)部變量表;(2)存儲(chǔ)特點(diǎn)1)靜態(tài)內(nèi)部變量屬于靜態(tài)存儲(chǔ)。在程序執(zhí)行過(guò)程中,即使所在函數(shù)調(diào)用結(jié)束也不釋放。換句話說(shuō),在程序執(zhí)行期間,靜態(tài)內(nèi)部變量始終存在,但其它函數(shù)是不能引用它們。2)定義但不初始化,則自動(dòng)賦以"0"(整型和實(shí)型)或'\0'(字符型);且每次調(diào)用它們所在函數(shù)時(shí),不再重新賦初值,只是保留上次調(diào)用結(jié)束時(shí)值?。?)何時(shí)使用靜態(tài)內(nèi)部變量1)需要保留函數(shù)上一次調(diào)用結(jié)束時(shí)值。2)變量只被引用而不改變其值。第31頁(yè)第31頁(yè)2.動(dòng)態(tài)存放──自動(dòng)局部變量(又稱自動(dòng)變量)(1)定義格式:[auto]數(shù)據(jù)類型變量表; (2)存放特點(diǎn)1)自動(dòng)變量屬于動(dòng)態(tài)存放方式。在函數(shù)中定義自動(dòng)變量,只在該函數(shù)內(nèi)有效;函數(shù)被調(diào)用時(shí)分派存放空間,調(diào)用結(jié)束就釋放。在復(fù)合語(yǔ)句中定義自動(dòng)變量,只在該復(fù)合語(yǔ)句中有效;退出復(fù)合語(yǔ)句后,也不能再使用,不然將引發(fā)錯(cuò)誤。2)定義而不初始化,則其值是不確定。3)因?yàn)樽詣?dòng)變量作用域和生存期,都局限于定義它個(gè)體內(nèi)(函數(shù)或復(fù)合語(yǔ)句),因此不同個(gè)體中允許使用同名變量而不會(huì)混同。即使在函數(shù)內(nèi)定義自動(dòng)變量,也可與該函數(shù)內(nèi)部復(fù)合語(yǔ)句中定義自動(dòng)變量同名。提議:系統(tǒng)不會(huì)混同,并不意味著人也不會(huì)混同,因此盡也許少用同名自動(dòng)變量!第32頁(yè)第32頁(yè)3.存儲(chǔ)器存儲(chǔ)──存儲(chǔ)器變量普通情況下,變量值都是存儲(chǔ)在內(nèi)存中。為提升執(zhí)行效率,C語(yǔ)言允許將局部變量值存儲(chǔ)到存儲(chǔ)器中,這種變量就稱為存儲(chǔ)器變量。定義格式下列:

register數(shù)據(jù)類型變量表;(1)只有局部變量才干定義成存儲(chǔ)器變量,即全局變量不行。(2)對(duì)存儲(chǔ)器變量實(shí)際處理,隨系統(tǒng)而異。比如,微機(jī)上MSC和TC將存儲(chǔ)器變量實(shí)際當(dāng)作自動(dòng)變量處理。(3)允許使用存儲(chǔ)器數(shù)目是有限,不能定義任意多個(gè)存儲(chǔ)器變量。第33頁(yè)第33頁(yè)試寫出程序執(zhí)行結(jié)果main(){autointa=2;registerintb=2;staticintc=2;printf(“*****a=%d,b=%d,c=%d\n”,a,b,c);f(a);f(b);f(c);printf(“*****a=%d,b=%d,c=%d\n”,a,b,c);}intf(intx){autointa=10;registerintb=20;staticintc;a=a+x;b=b-x;c=c+x*x;printf(“a=%d,b=%d,c=%d\n”,a,b,c);}*****a=2,b=2,c=2a=12,b=18,c=4a=12,b=18,c=8a=12,b=18,c=12*****a=2,b=2,c=2例程func7.c第34頁(yè)第34頁(yè)全局(外部)變量全局變量定義在函數(shù)之外,能被其它函數(shù)所共享。其作用域是從定義點(diǎn)到本文獻(xiàn)結(jié)束。假如定義點(diǎn)之前函數(shù)需要引用這些外部變量時(shí),需要在函數(shù)內(nèi)對(duì)被引用外部變量進(jìn)行闡明。外部變量闡明普通形式為:

extern數(shù)據(jù)類型外部變量[,外部變量2……];

當(dāng)一個(gè)程序由多個(gè)源文獻(xiàn)構(gòu)成時(shí),而這多個(gè)源文獻(xiàn)需要公用一個(gè)變量(全局)時(shí),則可在一個(gè)源文獻(xiàn)中定義,然后可用上述闡明辦法(extern)在其它需要使用變量源文獻(xiàn)中申明。如:

P1.c文獻(xiàn)中#include“p2.c”inta;main(){ ……}P2.c文獻(xiàn)中externinta;Power(intn){ ……}例程func10.cfunc101.c第35頁(yè)第35頁(yè)對(duì)于全局變量及存儲(chǔ)方式尚有下列幾點(diǎn)闡明:(1)外部變量可加強(qiáng)函數(shù)模塊之間數(shù)據(jù)聯(lián)系,但又使這些函數(shù)依賴這些外部變量,因而使得這些函數(shù)獨(dú)立性減少。從模塊化程序設(shè)計(jì)觀點(diǎn)來(lái)看這是不利,因此不是非用不可時(shí),不要使用外部變量。(2)在同一源文獻(xiàn)中,允許外部變量和內(nèi)部變量同名。在內(nèi)部變量作用域內(nèi),外部變量將被屏蔽而不起作用。(3)全局變量都是靜態(tài)保留,用static定義全局變量時(shí),此變量將只能被在本文獻(xiàn)中函數(shù)使用,而不能在別文獻(xiàn)中使用。即有助于限制變量作用域。注意:外部變量定義和外部變量闡明是兩回事。外部變量定義,必須在所有函數(shù)之外,且只能定義一次。而外部變量闡明,出現(xiàn)在要使用該外部變量函數(shù)內(nèi),并且能夠出現(xiàn)多次。在函數(shù)內(nèi)extern變量闡明,表示引用本源文獻(xiàn)中外部變量!而函數(shù)外(通常在文獻(xiàn)開頭)extern變量闡明,表示引用其它文獻(xiàn)中外部變量。第36頁(yè)第36頁(yè)靜態(tài)局部變量和靜態(tài)外部變量同屬靜態(tài)存放方式,但二者區(qū)分較大:(1)定義位置不同。靜態(tài)局部變量在函數(shù)內(nèi)定義,靜態(tài)外部變量在函數(shù)外定義。(2)作用域不同。靜態(tài)局部變量屬于內(nèi)部變量,其作用域僅限于定義它函數(shù)內(nèi);即使生存期為整個(gè)源程序,但其它函數(shù)是不能使用它。靜態(tài)外部變量在函數(shù)外定義,其作用域?yàn)槎x它源文件內(nèi);生存期為整個(gè)源程序,但其它源文件中函數(shù)也是不能使用它。(3)初始化處理不同。靜態(tài)局部變量,僅在第1次調(diào)用它所在函數(shù)時(shí)被初始化,當(dāng)再次調(diào)用定義它函數(shù)時(shí),不再初始化,而是保留上1次調(diào)用結(jié)束時(shí)值。而靜態(tài)外部變量是在函數(shù)外定義,不存在靜態(tài)內(nèi)部變量“重復(fù)”初始化問(wèn)題,其當(dāng)前值由最近1次給它賦值操作決定。第37頁(yè)第37頁(yè)務(wù)必切記:把局部變量改變?yōu)殪o態(tài)內(nèi)部變量后,改變了它存放方式,即改變了它生存期。把外部變量改變?yōu)殪o態(tài)外部變量后,改變了它作用域,限制了它使用范圍。因此,關(guān)鍵字“static”在不同地方所起作用是不同。第38頁(yè)第38頁(yè)C語(yǔ)言程序普通結(jié)構(gòu)C程序可由多個(gè)源文獻(xiàn)構(gòu)成,每個(gè)源文獻(xiàn)由予編譯命令、函數(shù)構(gòu)成,每個(gè)函數(shù)由函數(shù)首部和函數(shù)體構(gòu)成,每個(gè)函數(shù)體由闡明部分和執(zhí)行部分(語(yǔ)句)構(gòu)成。下列:P1.c文獻(xiàn)#include“p2.c”#include“stdio.h”#definprice30inta;main(){intx,y;……}P2.c文獻(xiàn)#include“stdio.h”externinta;Power(intn){inty;……returny;}第39頁(yè)第39頁(yè)編譯預(yù)處理C語(yǔ)言提供編譯預(yù)處理功效,允許在程序中使用幾種特殊命令,以供編譯預(yù)處理,然后將預(yù)處理結(jié)果和源程序一起再進(jìn)行通常編譯處理。C提供三種編譯預(yù)處理處理功效:1:宏定義2:文獻(xiàn)包括3:條件編譯第40頁(yè)第40頁(yè)宏定義不帶參數(shù)宏定義帶參數(shù)宏定義帶參數(shù)宏定義和函數(shù)區(qū)別宏定義長(zhǎng)處第41頁(yè)第41頁(yè)不帶參數(shù)宏定義格式:#define標(biāo)示符字符串功效:用宏名(標(biāo)示符)代替字符串例:#definePI3.14闡明:1:宏名普通用大寫字母.如:#define

PI

3.142:宏定義不是C語(yǔ)句,行末不加分號(hào),若加分號(hào),則連分號(hào)一起置換.如:#definePI3.14;3:define命令出現(xiàn)在程序中函數(shù)外面,宏名有效范圍是:定義命令之后到本源文獻(xiàn)結(jié)束,通常寫在文獻(xiàn)開頭.能夠用#undef命令終止宏定義作用域.如: #definePI3.14main(){......}

#undefPI......第42頁(yè)第42頁(yè)4:能夠引用已定義宏名,如:#definePI3.14#defineR3.0#defineAREAPI*R*Rmain(){printf("Theareais%d\n",AREA);}5:雙引號(hào)中area不置換第43頁(yè)第43頁(yè)帶參數(shù)宏定義格式:#define宏名(參數(shù)表)字符串功效:用宏名代替字符串,并且進(jìn)行參數(shù)替換#definePI3.14#defineS(r)PI*r*rmain(){floata,area;scanf("%f",&a);area=S(a);/*等價(jià):area=PI*a*a*/printf("r=%f,area=%f\n",a,area);}…...第44頁(yè)第44頁(yè)帶參數(shù)宏定義闡明1:對(duì)area=S(a+b)之類,帶入結(jié)果:area=PI*a+b*a+b改為:#defineS(r)PI*(r)*(r)

area=PI*(a+b)*(a+b)2:宏定義時(shí)宏名和括號(hào)之間不能有空格如:#defines(r)PI*r*r,系統(tǒng)認(rèn)為用s代替(r)Pi*r*r…..第45頁(yè)第45頁(yè)帶參數(shù)宏定義和函數(shù)區(qū)別函數(shù)先求出實(shí)參表示式值然后帶入形參在程序運(yùn)營(yíng)時(shí)處理分派暫時(shí)工作單元形參和實(shí)參都要定義類型,并且類型要求一致.占運(yùn)營(yíng)時(shí)間較復(fù)雜模塊用函數(shù)較好.不使源程序變長(zhǎng)宏只是進(jìn)行簡(jiǎn)樸字符替換編譯時(shí)進(jìn)行,不分派內(nèi)存單元,不進(jìn)行值傳遞處理,也沒(méi)返回值概念宏名無(wú)類型,參數(shù)無(wú)類型,只是一個(gè)符號(hào)代表占編譯時(shí)間,不占運(yùn)營(yíng)時(shí)間用宏來(lái)代表簡(jiǎn)短表示式比較適當(dāng)展開后使源程序變長(zhǎng)第46頁(yè)第46頁(yè)帶參數(shù)宏定義和函數(shù)區(qū)別舉例函數(shù)main(){ inta,b,c,d,t; a=2;b=3;c=1;d=5; t=max(a+b,c+d); printf("%d",t);}max(x,y)intx,y;{return(x>y?x:y);}宏#defineMAX(x,y)(x)>(y)?(x):(y)main(){ inta,b,c,d,t; a=2;b=3;c=1;d=5; t=MAX(a+b,c+d); printf("%d",t);}…...例程func11.cfunc12.c第47頁(yè)第47頁(yè)宏定義長(zhǎng)處能夠簡(jiǎn)化程序,以便修改等。#definePRINT(v)printf("v=%d\t",v)main(){ inta,b,c,d;a=1;b=2;c=3;d=4;PRINT(a);PRINT(b);PRINT(c);PRINT(d);}…..第48頁(yè)第48頁(yè)文獻(xiàn)包括處理文獻(xiàn)包括概念頭文獻(xiàn)概念頭文獻(xiàn)使用舉例頭文獻(xiàn)使用闡明第49頁(yè)第49頁(yè)文獻(xiàn)包括概念含義:一個(gè)源文獻(xiàn)能夠?qū)⒘硪粋€(gè)源文獻(xiàn)所有內(nèi)容包括進(jìn)來(lái).實(shí)現(xiàn)辦法:#include"文獻(xiàn)名"比如:程序file1.c#include"file2.c"AAfile2.c第50頁(yè)第50頁(yè)頭文獻(xiàn)使用場(chǎng)合:#include"頭文獻(xiàn).h"長(zhǎng)處:能夠減少程序員重復(fù)勞動(dòng)。…...第51頁(yè)第51頁(yè)頭文獻(xiàn)使用舉例主程序:#include"p.h"main(){floatr,area,l;r=3;area=S(r);l=2*PI*r;PRINT(r);PRINT(area);PRINT(l);}…...頭文獻(xiàn):p.h#include<stdio.h>#definePI3.14#defineS(a)PI*(a)*(a)#definePRINT(v)printf("v=%f\t",v)例程func13.c第52頁(yè)第52頁(yè)頭文獻(xiàn)闡明1:一個(gè)include命令只能指定一個(gè)被包括文獻(xiàn),若要包含n個(gè),則要用n個(gè)include2:文獻(xiàn)包括格式有兩種:

溫馨提示

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