大學C語言程序設計第二電子工業(yè)第章3_第1頁
大學C語言程序設計第二電子工業(yè)第章3_第2頁
大學C語言程序設計第二電子工業(yè)第章3_第3頁
大學C語言程序設計第二電子工業(yè)第章3_第4頁
大學C語言程序設計第二電子工業(yè)第章3_第5頁
已閱讀5頁,還剩86頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第6章函數(shù)與編譯預處理6.1函數(shù)概述6.2函數(shù)的定義和說明6.3函數(shù)的調用6.4函數(shù)的參數(shù)6.6變量的存儲類型6.7內部函數(shù)和外部函數(shù)6.8編譯預處理命令6.5函數(shù)的嵌套調用與遞歸調用

6.1函數(shù)概述

★函數(shù)是封裝了一定功能的模塊

★C語言是函數(shù)驅動式語言(一個源程序文件由一個或多個函數(shù)組成)#include“stdio.h”

voidmain(

)//函數(shù)頭

{

inta=8;

printf(“a=%d”,a);

}

//函數(shù)體★一個C源程序必須有且只能有一個主函數(shù)main(

)。C程序總是從main(

)函數(shù)開始執(zhí)行,最后結束于main(

)函數(shù),其他函數(shù)是通過main(

)直接或間接調用完成其功能的。#include<stdio.h>intadd(intx,inty){ints;s=x+y;returns;}main(){inta=1,b=2,c;c=add(a,b);printf("%d\n",c);}kj61一、函數(shù)定義二、函數(shù)聲明三、函數(shù)調用#include<stdio.h>main(){inta=1,b=2,c;

intadd(intx,inty);c=add(a,b);printf("%d\n",c);}intadd(intx,inty){ints;s=x+y;returns;}函數(shù)概述(1)一個C程序由一個或多個源(程序)文件組成——可分別編寫、編譯和調試。(2)一個源文件由一個或多個函數(shù)組成,可為多個C程序公用。(3)C語言是以源文件為單位而不以函數(shù)為單位進行編譯的。(4)在C語言中,所有函數(shù)(包括主函數(shù)main(

))都是平行的。一個函數(shù)的定義,可以放在程序中的任意位置,主函數(shù)main(

)之前或之后。但在一個函數(shù)的函數(shù)體內,只能調用其他函數(shù),不能再定義另一個函數(shù),即不能嵌套定義。(5)主函數(shù)名main是系統(tǒng)定義的,是運行時首先被調用的函數(shù),它可以調用其他函數(shù),但不能被其他函數(shù)調用;其他函數(shù)間可以互相調用,也允許嵌套調用。(6)從函數(shù)定義的角度看,函數(shù)可分為庫函數(shù)和用戶定義函數(shù)兩種。①庫函數(shù):由C系統(tǒng)提供,用戶無須定義,也不必在程序中進行類型說明,只需在程序前寫出包含有該函數(shù)原型的頭文件即可在程序中直接調用。在前面各章的例題中反復用到的printf(

)、scanf(

)、getchar(

)、putchar(

)、gets(

)、puts(

)等函數(shù)均在頭文件stdio.h中,sqrt(),fabs(),pow()等函數(shù)均在頭文件math.h中。②用戶定義函數(shù):由用戶按需要編寫的函數(shù)。對于用戶自定義函數(shù),不僅要在程序中定義函數(shù)本身,而且還必須在主調函數(shù)模塊中對該被調函數(shù)進行類型說明,然后才能使用。(7)從主調函數(shù)和被調函數(shù)之間數(shù)據(jù)傳送角度看,函數(shù)又可分為無參函數(shù)和有參函數(shù)兩種。(8)C語言的函數(shù)兼有其他語言中的函數(shù)和過程兩種功能,從這個角度看,又可把函數(shù)分為有返回值函數(shù)和無返回值函數(shù)兩種。6.2.1函數(shù)定義C語言函數(shù)定義格式如下:[函數(shù)返回值的類型名]函數(shù)名([類型名形式參數(shù)1,類型名形式參數(shù)2,…])/*函數(shù)頭*/{[說明部分;]/*函數(shù)體*/[語句部分;]}其中[]內為可選項。注意:函數(shù)名、一對圓括號和花括號不能?。?.2函數(shù)的定義和說明1.無參函數(shù)無參函數(shù)的一般形式函數(shù)返回值的類型名函數(shù)名(void){[說明語句部分;][可執(zhí)行語句部分;]}例:

構造一個輸出一行”*”的函數(shù):voidprintstar(void){printf(“******************\n”);}

kj622.有參函數(shù)例:編寫函數(shù)交換2個數(shù);kj63voidswap(inta,intb){inttemp;temp=a;a=b;b=temp;}

不能寫成:voidswap(inta,b){inttemp;temp=a;a=b;b=temp;}函數(shù)返回值類型函數(shù)名參數(shù)類型說明及參數(shù)列表6.2.2函數(shù)的返回值函數(shù)分為有返回值函數(shù)和無返回值函數(shù)。return語句的格式:return(表達式);或return表達式;或return;功能:1、把return后面“表達式”的值帶給調用函數(shù);

2、把控制轉向調用函數(shù);格式return;只有功能2例:編寫函數(shù),返回2個整數(shù)的最大公約數(shù)。(輾轉相除法)kj64

intf(intx,inty){intr,t;if(x<y){t=x;x=y;y=t;} while((r=x%y)!=0) {x=y;y=r;}returny;}

注意:(1)

聲明為void型的函數(shù)中不能包括帶值的return語句;主函數(shù)體內一般不用return語句。(2)當函數(shù)沒有return語句時,以結束函數(shù)的大括號}作為返回點。但這時并不表明函數(shù)沒有返回值,這時的返回值是系統(tǒng)給的不確定值。(3)在同一函數(shù)內,可根據(jù)需要在多處出現(xiàn)return語句,但函數(shù)第一次遇到return時就立即停止執(zhí)行,并返回到主調函數(shù);(4)return語句中返回值表達式的類型應該和函數(shù)類型一致。如果不一致,則以函數(shù)類型為準,由系統(tǒng)自動進行轉換。如果缺省函數(shù)類型,則系統(tǒng)一律按int類型處理。intf(chars1,chars2){if(s1==s2)return1; return0;}kj65

例:

計算兩數(shù)之和

#include<stdio.h>doubleadd(doublex,doubley){doubles;s=x+y;returns;}main(){doublea,b,c;a=10.5;b=20.3;c=add(a,b);printf("%lf",add(a,b));add(a,b);}Kj66運行結果為:30.8改成:intadd(doublex,doubley)?6.2.3函數(shù)說明1.函數(shù)說明的形式函數(shù)說明也稱為函數(shù)聲明,使用函數(shù)說明語句能夠讓C編譯程序了解函數(shù)返回值類型被調用函數(shù)說明一般格式如下:函數(shù)類型函數(shù)名(數(shù)據(jù)類型[參數(shù)名1][,數(shù)據(jù)類型[參數(shù)名2]…]);函數(shù)說明語句其實就是函數(shù)定義中的函數(shù)首部加上分號,這些內容稱為函數(shù)原型。如:doublemax(doublex,doubley);voidswap(inta,intb);

例:

計算兩數(shù)之和#include<stdio.h>main(){doublea,b,c;a=10.5;b=20.3;c=add(a,b);printf("%lf",add(a,b));add(a,b);}doubleadd(doublex,doubley){doubles;s=x+y;returns;}kj67doubleadd(doublex,doubley);doubleadd(doublex,doubley);注意:有三種情況不需說明:

a、函數(shù)返回值為整型或字符型;

b、被調用函數(shù)定義出現(xiàn)在主調函數(shù)之前;

c、已在所有的函數(shù)定義之前(即文件的開頭)說明了函數(shù)類型。

6.3函數(shù)的調用1、調用形式:函數(shù)名(實參表列);實參與形參個數(shù)相等,類型一致。調用函數(shù)時兩者按順序一一對應傳遞數(shù)據(jù)。main(){inta=1,b,f(int,int);b=f(a,++a);printf("%d",b);}intf(intx,inty){intz;if(x>y)z=1;elseif(x==y)z=0;elsez=-1;return(z);}例:參數(shù)求值順序main(){inta=1,b,f(int,int);b=f(a,a++);printf("%d",b);}intf(intx,inty){intz;if(x>y)z=1;elseif(x==y)z=0;elsez=-1;return(z);}運行結果:0運行結果:12、調用方式:按函數(shù)在程序中出現(xiàn)的位置來分有三種方式。①函數(shù)語句。只完成一個操作,并不要求函數(shù)帶回值。如:printstar();scanf(“%d”,&a);②函數(shù)表達式。

出現(xiàn)在表達式中,函數(shù)值參與表達式運算。如:c=2*max(a,b);y=x+power(x,3);③函數(shù)參數(shù)。函數(shù)調用作為一個函數(shù)的實參。如:m=max(a,max(b,c));printf(“%8.2f\n”,power(x,3));課堂練習:下面程序的輸出結果是()。#include<stdio.h>func(inta,intb){intc;c=a+b;returnc;}main(){intx=6,y=7,z=8,r;r=func((x--,y+=2,x+y),z);printf("%d\n",r);}A.11 B.20 C.21 D.22

課堂練習:若有以下函數(shù)調用語句:fun(a+b,(x,y),fun(n+k,d,(a,b)));fun函數(shù)參數(shù)的個數(shù)是A)3B)4C)5D)66.4函數(shù)的參水數(shù)形參與實付參形式參稠數(shù):定崗義函數(shù)幸時函數(shù)齊名后面患括號中皺的變量漏名。實際參亮數(shù):調干用函數(shù)游時函數(shù)狐名后面怪括號中撓的表達要式。例:編寫程序滿實現(xiàn)從兩沸整數(shù)中求逼較大數(shù)。#inc霸lude盈<std決io.h籃>flo烤at胞max惹(fl句oat棍x,納flo噴at尺y);/*函數(shù)說布明*/mai偽n(){floa漠ta,終b;floa印tc;scan芬f("%f,%f",&蒜a,&b宇);c=ma禍x(a,改b);/*調用函數(shù)帽語句,a,b為實參*/prin今tf("申a=%f,b辟=%f\n爛max汽=%f\n獄",a逐,b,片c);}flo曬at放max怎(fl喂oat斑x,感flo貨at匹y)/*函數(shù)定義,x,y為形參*/{floa序tz;z=x>展y?x:君y;prin厲tf(“但x=%f,y枕=%f\nz饒=%f\n翻”,x云,y,悼z);ret那urn府(z)章;}x脊y形參ab實參說明:實參必拐須有確求定的值,形參必班須指定改類型形參與實故參類型一肝致,個數(shù)綢相同若形參橋與實參寇類型不窮一致,核自動按溝形參類玩型轉換——函數(shù)調勾用轉換值傳遞具方式形參在失函數(shù)被握調用前細不占內這存;函數(shù)調天用時,為形參董分配單有元,并將實參掛的值復制蠶到形參中杜;調用結云束,形參艇單元被釋碌放,實參枯單元仍保攜留并維持朵原值特點:形參與蝴實參占暫用不同夾的內存熱單元單向傳遞例:刪計算x的立方#in限clu鄉(xiāng)豐de犧<st半dio給.h>floa防tcu并be(f副loat黃x){擇re開tur貫n(x疑*x*狼x);}mai世n(){冬fl蠢oat沖a朵,p鼻rod融uct怖;sca鑰nf(華"%f慨",&撓a);pro悅duc趙t=c挺ube淋(a)彈;prin塔tf(”嚴%.4由f%駱.4f\蒸n",a膨,pro捉duct圓);}xaproduct××××1.21.21.7分281030x:y:調用前:調用結束:1030x:y:例:息交換兩個御數(shù)#inc豆lude顧<st抖dio.牌h>main取(){簡int厚x=10姥,y=3工0;prin甘tf("燭%d,%壟d\n"哀,x,y勺);pri佳ntf模("s羽wap符ped纏:\n半");swa艷p(x穩(wěn),y)叨;pri蝕ntf誰("%兩d,%奪d\n屢",x影,y)牌;}swa泰p(int賞a,in剛tb){請int托temp讓;temp瞎=a;嘉a=b;棗b=t梅emp;}調用:1030a:b:1030x:y:swap:1030x:y:3010a:b:temp一般函數(shù)攤調用main()調用函數(shù)a結束a函數(shù)執(zhí)行2134566.5函數(shù)的嵌處套調用和洗遞歸調用6.5鼻.1函數(shù)的嵌烏套調用函數(shù)的恰嵌套調蚊用是指傳,在執(zhí)貌行被調縣用函數(shù)仰時,被煮調用函庫數(shù)又調邊用了其凳它函數(shù)袖。這與言其它語勉言的子隨程序嵌折套調用堂的情形落是類似婦的,其次關系可跪表示如銷右圖所項示。例:求三個色數(shù)中最扔大數(shù)和存最小數(shù)編的差值int膀ma頃x(i頸nt員x,i經(jīng)nt水y,i捧nt終z)洽/*定義函數(shù)max求x,y,畢z中最大值爛*/{跪int塘r;r=x>錯y?x:粘y;ret鳥urn星(r>功z?r為:z)堂;}int繳mi澡n(i賀nt茂x,i柄nt沈y,i牌nt鄭z)艦/*定義函數(shù)min麥,求x,y,余z中最小擊值*/{址int榆r;r=x<們y?x:裙y;retu節(jié)rn(r旁<z?r晌:z);}int涌dif(紫int壯x,in翻ty,頑int窮z)哄/*定義函網(wǎng)數(shù)dif*雹/{ret絮urn戒ma綱x(x杜,y,聲z)-夸min賓(x,暫y,z籮);者/*嵌套調用偵*/}void肯mai詠n(){i館nta撤,b,c評,d;sca烏nf("%d%d梳%d",拘&a,&正b,&c稻);d=d盤if(遣a,b昨,c)旁;駁/*調用函巴數(shù)dif*親/prin家tf("油Max-棕Min=%d\n"攝,d);}若輸入2、3,求以違下程序多的運行專結果,烈分析嵌晝套調用藝的執(zhí)行的過程。#inc右lude私<st逆dio.躬h>int曾f(i膚ntn智){漲int關rt蔽n=0;裹in養(yǎng)ti;for(北i=1;第i<=n疲;i++蠶)rtn備*=i箭;ret煙urn娘(rt均n);}lon類gs佳um(徹int坊a,閱int貪b){言lon美gc1懲,c2;c1=已f(險a);肌c擔2=f簡(b章);茶re既tur辱n(c輸1+c跌2);}main料(){群int積n1=5秒,n2=某10,恥a;a=s乞um(防n1,柱n2)妥;prin弟tf("展a=%d皮",a)臟;}6.5廁.2函數(shù)的遞善歸調用在調用一路個函數(shù)的田過程中又犧出現(xiàn)直接愚或間接地戰(zhàn)調用該函乖數(shù)本身,鴨稱為函數(shù)塑的遞歸調戶用。遞歸調用廁形式如下:(1)直接遞溪歸void烘a(只){..討.…a(獵);躬/種*自己調用夢自己,直接遞歸茂*/...懂…}函數(shù)a()調用函商數(shù)a()(2)間接遞歸voi海da拿(){..候.…b(賺);/怨*調用函憤數(shù)b冠*/...…}voi框db吸(){..唱...篇.a(傅);扛/*調用函數(shù)a,間接遞歸染*/……}調b調aa()b()以上是滋無終止靜的函數(shù)漏調用,沈因此,肥一個正著確的遞歸調用孕的函數(shù)必皮須滿足以鍋下條件:1、一個騰問題轉沙化成一競個新問晶題,解雪題方法烤相似,商只是所拜處理的股對象的寺值有規(guī)分律的遞客增或遞傭減。2、可以螞應用這蝕個轉換夜過程使填問題得洋到解決洞。3、必須有禽明確的結甲束遞歸的單條件;分析問題2種方法答:遞推陣和遞歸遞推:從一個已瞇知的事實過出發(fā),按怎一定的規(guī)白律推出下認一個事實鈴。通常利用急迭代公式些法,通過星循環(huán)結構膀實現(xiàn),循蒙環(huán)的終值鏟是問題的戚結果。遞歸:從要求的柱結果出發(fā)培,歸納出夾后一個結胡果和前一熟個結果存遭在的關系粒,直到一比個已知值敘為止(即糟反推法)掌。通常設計緒函數(shù)(遞剝歸函數(shù))例,不斷使袋用下一級祝值調用自織身,直到毫一個已知煌的值(遞昌歸出口)盤。0!=11!=0!*1…………增….n!=毛(n-攤1)!飲*n例:駛求n的階乘n!遞推公式舞:1條n=0sn=sn-1*n拿n>營0程序段為伏:#inc漸lude股<std膊io.h散>main烈(){易i偶nt廟m=1孟,i,楚n;scan蝕f("%茅d",&進n);for題(i=怖1;i旦<=n判;i+舟+)m=m*嗎i;prin塘tf("帆the謀resu填lti宗s%1泛0d",吉m);}例:求n的階乘n!遞歸方齊法求n!由于n!=n循*(n-悠1)!是遞歸定著義所以求n?。╪-1)!(n-恩1)!(n-2)!(n–動2)!(n-3)!……票1!熔0!的問題揉,圈已知蠅條件為:0!=1。遞歸函園數(shù):1裂n=煉0f(n中)=f(n辨-1)仆*n日n>0遞歸函數(shù)脹一般形式耕:函數(shù)名f(參數(shù)){i象f(n==初值)答結果=….賊;else結果=含f(n-煤1)的表達位式;retu孔rn(返回結續(xù)果);}#inc襪lude地<st轎dio.咽h>int西f(栗int顏x){極in紋tt枯;if(看x==姓0)釣t=姥1;/*遞歸出口頃*/els岡et=f跪(x-1照)*x;;/*遞歸公式因*/retu很rn(t列);}main梅(){奔int倦n=0,疊s;sca瞧nf(蒼"%d像",&腿n);s=f(姐n);pri渡ntf作("%肝d!振=%1玻0d"偷,n,撤s);}f函數(shù)在臂回推階脖段被調費用了4盆次,遞演歸調用融了3次吵,到終肆止條件鐵才有確子定的值參,然后度再遞推灑出每一勺次調用獎的值,挽最后得蘆到所求符的結果具。例:好求Fibo夢nacc患i數(shù)列:打印1,1捉,2,的3,5致,8,聲……的麗前40漫個數(shù)。#inc少lude暗<st齒dio.白h>main鋼(){lo紋ng該f1,撇f2;int應i;f1=1吃;源f2=1風;for(完i=1類;i有<20呢;i+回+){p勵rin梁tf(甩"%1茅2ld過%12肺ld"休,f閉1,吵f2柱);if(稈i%2蕉==0)加pr蘿intf言("\暗n")賞;f1=子f1麥+古f2盈;f2=宴f2+透f1掉;}}方法1:用循環(huán)溝結構來實繪現(xiàn)#inc沉lude日<st游dio.刮h>int剝fib(候int詳n){in霜tf;if與(n=戲=1|余|n=深=2)功f=暈1;else米f=弱fib(乏n-1)盲+fib幅(n-2癥);retu左rnf授;}main闖(){i副nt俯i;for此(i炎=1;儉i勒<=4孕0;琴i+言+){p掠rin箭tf(技"%1蠻5d"甚,fi喊b(i搜));if(i信%4==閉0)prin涌tf("油\n")氧;}}方法2:用遞歸賞函數(shù)來實司現(xiàn)例:反向輸汁出一個烈整數(shù)#in筒clu蜻de<春std擠io.漫h>main第(){宮int兄n;scan狹f("%鹽d",&淺n);if(封n<0究){n=-鉗n;pri端ntf乖("-泊");}whil污e(n!泰=0){pri臭ntf(救"%d"帝,n%1師0);n=n霞/10么;}}方法1:用循舍環(huán)結構干來實現(xiàn)#inc厲lude吳<std腳io.h旗>void者mai采n(){草voi路dp竊rin歸tn(家int嗚x)純;脫int蒜n;sca謎nf(撿"%d",&蜘n);if(差n<0藍){ n禿=-n餡;p緞utc遲har通('-講');備}prin回tn(n港);}void段pri棒ntn(潮int浴x)東/*反向輸槐出整數(shù)x*/{夢if(氧x>=亮0&&畢x<=椅9)桑/*若x為一位整澡數(shù)*/pri稀ntf角("%d",倆x);女/*則輸出整指數(shù)x*/els傅e懂/*否則*/{pri押ntf僑("%d",亞x%10);慮/*輸出x的個位施數(shù)字*/prin脆tn(x和/10)銜;/*將x中的個勞位數(shù)字述去掉,憶形成新福的x后,繼泥續(xù)遞歸柳操作*/}}方法2:用遞榮歸函數(shù)藏來實現(xiàn)輸出一個若正整數(shù)的極遞歸算法胃為:if(n為一位歐整數(shù))輸出n;else{輸出n的個位數(shù)糊字;對剩余示數(shù)字組煤成的新談整數(shù)重續(xù)復"反向輸出"操作;}例:漢須諾塔問題。初始狀態(tài)科:有3個塔,巡壽每個都宮堆放若幫干個盤艱子。開氏始時,靜所有盤變子均在攻塔a上,并且甚,盤子從很上到下,赴按直徑增患大的次序惕放置。要求解習決問題造:設計一個某盤子移動琴的序列,糞使得塔a上的所激有盤子漢借助于派塔b移動到凈塔c上。兩個限問制:1)一次只廣能移動一滾個盤子;2)任何時橋候都不能黑把盤子放藏在比它小的盤子的堅上面。假設塔a有n個盤子已知條件兵:若只有一自個盤子,躁則是直接織從1移到份3(遞歸駝出口)算法設級計如下紗:第一步:億把n-1個盤子依騙照題目中兄的規(guī)則從萍塔a(源塔動)借助習于塔c(中間網(wǎng)塔)搬李到塔b(目標塔伸)。第二步:滾將剩下的滴一只盤(懸也就是最姓大的一只毒)直接從救塔a(源塔)松搬到那個途仍然空著福的塔c(目標減塔)。第三步載:再次遍將b塔(源偶塔)上摸的n-1個盤子鳥借助于消塔a(中間舊塔)搬唱到塔c(目標暖塔)??噙@一步毛是沒有慮問題的鄭,因為c塔上僅尋有一只辦最大的想盤。函數(shù)han運oi(園int揉n,員int衛(wèi)a角,in林tb鉤,in鑰tc甩)設計:1.如果(n==眼1)則ac;2.否則執(zhí)碎行3步2-1調用函統(tǒng)數(shù)han弓oi(預n-1拉,a,士c,b丸);2-2料ac;2-3調用函學數(shù)hano求i(n-邁1,b,息a,c)拍;例Hano翅i問題#in撿clu撲de<歸std極io.查h>void元han芹oi(i贈ntn蔥,int念a,鈔int竹b,in膏tc){掀if(n執(zhí)==1)興pr邀intf沖("%d噸->%d豪\n",竹a,c)亦;els魄e{卵h毒anoi學(n-1姜,a,c碌,b);prin檢tf("增%d->塞%d\n慈",a,創(chuàng)c);hano售i(n-未1,b,穴a,c)胳;}}main簽(){誕in孫tn顏;prin辰tf("慚Inpu醋tn:鼠");sca功nf(傭"%d局",&培n);han幟oi(朵n,1稼,2,羽3);}運行情貢況如下題:inpu凈tn:武3↙the激step朝:1--怕>31--胳>23-->端21-->顧32--里>12--伙>31--隔>3先看一奮個例子,錯在那擔里?:#inc連lude腎"st舊dio.吹h"void孔f1(丙){i灰nt業(yè)t=2稅;a*=辦t;b/嚷=t招;}main洋(){i嚼nt訂a,附b;scan息f("%湊d,%d桂",&且a,&頂b);f1(痰);隙//調用函魂數(shù)f1(委)prin沈tf(剪"a=%海d,b=輛%d",列a,襖b);}忠1編譯程捉序會提衛(wèi)示出錯:Und辮efi躲ned虧sy元mbo飯l‘a(chǎn)’和Unde溝fine挪dsy拜mbol‘b’。為什么?6.6變量的存報儲類型6.6.牧1變量的生剝存期和作贊用域生存期:變量在舉某一時刻赴存在---距---既-靜態(tài)變量欄與動態(tài)變債量作用域:變量押在某區(qū)股域內有才效----為---局部變燒量與全稿局變量(文件、績函數(shù)、疏復合語厘句)6.6.想2變量的或存儲類語型(特性)1.c語言中鐵每一個變變量有雞兩個屬銷性:數(shù)據(jù)類型,存儲類型。完整的逢變量定族義:[存儲類型][數(shù)據(jù)類夕型]變量名;2.變量的愁存儲類型(特性)自動型auto靜態(tài)型sta漠tic寄存器型reg選ist悟er外部型ext抹ern程序區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)2.靜態(tài)存儲類型的糊變量的紗生存期浮為程序產(chǎn)執(zhí)行的存整個過赴程,在賊該過程饑中占有莊固定的貞存儲空腦間,稱本它們?yōu)橛谰么鎯?。sta珠tic躺ext忙ern動態(tài)存儲類型變鋤量只生存納在某一或段時間截內。例如,單函數(shù)的形須參和函數(shù)勒體內定義氧的變量,只是在程鴿序進入該軟函數(shù)時才蹦分配存儲糕空間,當該函數(shù)認執(zhí)行完后,變量對應蓮的存儲空柏間又被撤嚼銷了。atuo關r完egis劍ter局部變量瀉與全局變怖量局部變量---內部變量定義:在函數(shù)內或復合語桌句定義說明:mai明n(函數(shù)伍)中定義師的變量忠只在mai姓n(函數(shù))中有效。復合語句中定義的付變量只在復合語部句中有效。不同函燈數(shù)中同儲名變量崇,占不勇同內存屑單元。形參屬磚于局部拿變量。局部變辦量可用雅存儲類年型:auto將reg丹iste藥r。stat鑰ic(默認為auto)floatf1(inta){intb,c;…….}charf2(intx,inty){inti,j;……}main(){intm,n;…….}a,b,c有效x,y,i,j有效m,n有效#in瞧clu皆de<勞std氏io.鴉h>sub綿(){int尚a,桿b;a=6;b=7;prin堡tf("遙sub:絮a=%d旗,b=%恒d\n"尚,a,b背);}mai跟n(){aut柴oi躁nt彩a,b門;a=3性;b=4蓋;sub幣();pri掃ntf廣("m眠ain踏:a=錫%d,亞b=%肥d\n懂",a逢,b)籍;}焦31.自動聽變量局部靜示態(tài)變量飛值具有為可繼承安性局部靜湖態(tài)變量害的初始譜化只在史編譯時遙進行一率次,每次調用便他們所在月的函數(shù)時涉,不再重靈新賦初值杠;如定義爸但不初味始化,傍自動賦陡0或哪‘\夫0’1.靜態(tài)災局部變量stat不ic數(shù)據(jù)類型壩變量嗽名stat熔ic輝int貝i=蝕1;#inc商lude板<std驕io.h調>mai執(zhí)n(){void涂in我(vo純id);in誓();in(把);in()詠;}void御in觀(voi躬d){int零x=蘿0;x++;pri愉ntf憐(“%君d\n么”,x亮);}衛(wèi)4運行結果耀:111#inc勻lude楊<std肌io.h脾>mai跑n(){乖vo右id搬in掏(v橋oid慌);in陰();in(蠻);in(輕);}voi鐮d諒in料(vo翅id){我stat金ici投ntx宅=0;x++;prin椒tf(“底%d\n芳”,x)縱;}5運行結果丈:1231.靜到態(tài)局部漫變量例:分析執(zhí)拿行結果f(in武ta){int螞b=艘0;sta按tic譯in鋪tc薦=3;b++;甚c++;pri秀ntf撥("%支5d%店5d%票5d\堤n",封a,b獸,c)允;ret鋸urn哈(a+胳b+c遭);}main合(){int昆a=2郊,k;for賊(k=斗0;k起<3;糟k++袋)pri顯ntf臂("%替5d\地n",梅f(a捉));}幟6靜態(tài)變量酬只初始化鞭一次結果:2建1逆4(a,b縱,c)7輸(f志(a)嚇)2壞1懸582昏1凳69(3)r抖egis倉ter(寄存器)型將使用頻迅率高的變有量定義為reg仙ist航er型,可以提高尤運行速度普。寄存器變劣量只限于整型、字符型、指針型的局部要變量。寄存器變騾量是動態(tài)賠變量,而毛且數(shù)目有飽限,一般僅泉允許說奶明兩個樓寄存器羨變量,寇過多的男寄存器坊變量的購編譯器封可能把昌它看成Auto類型。例如:regi雹ster搭in勵td;reg猾ist燥er扒ch適ar諸c;全局變量---外部變籃量定義:在膏函數(shù)外定等義,可為剛本文件所做有函數(shù)共莊用有效范春圍:從號定義變兇量的位段置開始走到本源膠文件結票束,及鬼有ext勾ern說明的銜其它源塘文件外部變扣量說明索:外部變量笑定義與外陳部變量說村明不同若外部變休量與局部瘡變量同名禽,則外部尚變量被屏涂蔽外部變盞量可用例存儲類引型:缺省侮或stat畫ic#in蹤蝶clu皆de擔<st些dio壘.h>ext惑ern制in惠ta象,b右;voi附ds丈wap情(){i純nt孩t;t=嫌a;爐a半=b閃;b濃=始t;prin三tf(“蟻swap莊:a=%稱d,b=抵%d\n該”,a,暢b);}int毀a,壓b;main屆(){p慎rin煤tf(“Ente插ra,嚴b:”);sca齒nf(“%d,%賓d”,&薄a,碎&b)翻;swa墾p(照);prin山tf(“main擔:a=%叼d,b=尼%d”,a,很b);}紗7Ent鉆er雞a,b醋:5,等3↙swa繡p:a蚊=3,霸b=5main云:a=3巷,b=5運行結果全局變量貸有兩個問理題:其一:當全局變待量定義在捉后,引用萌它的函數(shù)食在前時,費如何使用涉該全局變睬量?這就注需要把該丙全局變量梅的作用域小延伸至該笛函數(shù);其二:能否使在棕某文件中蝴定義的全和局變量,議在其它文陽件中無須供再次定義盞而直接使象用它呢?擋這就需要抖把全局變攝量的作用拿域進行延悅伸。C語言可通寄過外部變遍量說明達驗到此目的牲。定義說明次數(shù):雷只能1次體可泉說明多段次位置:書所陽有函數(shù)之畫外身函數(shù)內蕉或函數(shù)外分配內蕩存:分博配內存,可初始營化抄不分周配內存,不可初什始化外部變量扇說明:exte叢rn數(shù)據(jù)類型蠢變量表;外部變量臥定義與外江部變量說儉明不同若外部獨變量與匙局部變璃量同名局,則外佛部變量微被屏蔽例外部變量定義與說明運行結果據(jù):max=姻13#in械clu籌de<梁std俗io.戀h>exte閥rn資int罪a,b;瘋//外部變量征說明int豈ma百x(i馳nt充x,柜in慚ty起);誕//函數(shù)說明mai她n(){p犯rin快tf(皺"ma滴x=%錯d",想max戀(a,涂b)欣);構}int溫a=13校,b=-擁8;武//外部變鉛量定義int獨max(裳int伶x,盾int窩y)竄//函數(shù)定義{i鐮nt淋z;z=x也>y?長x:y繞;ret編urn帳(z)極;}#in慘clu旁de徑<st賠dio薦.h>int皇a=劣7,b斬=9;味//買a,b為全局變拿量voi筍df燙1(i割nt托x室){int效t1帶;t1=鴨b*刺x;pri撐ntf寶("f壘1:t殘1=%清d,a鵝=%d窩,b=組%d\案n",顏t1六,3*埋a,3脂*b)網(wǎng);}main跟(){f1(偵2);掘/催/調用函數(shù)f1(跨)pri影ntf感("研mai插n:哭a=%跌d,b蜂=%d緩\n"耳,a允,b醬);}t塊8#inc懂lude詢<st慶dio.境h>int摸a,督b;娛/*鏡a,b為全局堅變量*/voi替df桐1(i顏nt洽x擺){i腳nt減t1族,a;//重新定烤義a,沒重新定盆義b,膊a值傳不過寬去。a=釣x*蛋4;t1=喪b乒*3則;b=杰10;pri盡ntf鄉(xiāng)豐("f貍1:t趴1=%件d,a蜂=%d托,b=虜%d\駕n",艦t1摟,a,殺b);}main滋(){a=鵝2;b枯=4;控/*此a,b是全局變量,賦值解*/f1(防2);鉗/*調用函墻數(shù)f1(旅)*/prin異tf(款"mai機n:a呆=%d,裁b=%d替",a途,b)聽;}9f1:果t1=聲12,慮a=8攻,b=狠10main營:a=2儉,b=1鵝0結論:全局變量懸與局部變緊量同名時,局部變血量起作用乏,全局曬變量被鑼屏蔽(迎不影響烤)變量存儲機類型小結靜態(tài)動態(tài)存儲方式程序整個運行期間函數(shù)調用開始至結束生存期編譯時賦初值,只賦一次每次函數(shù)調用時賦初值自動賦初值0或空字符不確定未賦初值靜態(tài)存儲區(qū)動態(tài)區(qū)存儲區(qū)寄存器局部變量外部變量作用域定義變量的函數(shù)或復合語句內本文件其它文件局部變脅量默認陡為aut墨o型reg望ist充er型變量概個數(shù)受首限,且框不能為long云,do露uble加,fl艙oat型局部sta禽tic變量具寸有全局盞壽命和你局部可向見性局部sta裂tic變量具磁有可繼達承性ext齒ern不是變量姐定義,可擴展顏外部變量作晉用域register局部staticauto外部static外部存儲類別6.7內部函緊數(shù)、外狗部函數(shù)C語言根據(jù)瘡函數(shù)能禁否被其坊它源文紹件中的晴函數(shù)調陡用,將挖函數(shù)分住為內部宋函數(shù)和殲外部函嚼數(shù)。6.7降.1內部函陣數(shù)(又葛稱靜態(tài)叨函數(shù))如果一個科函數(shù),只蜻能被本文麥件中的函泉數(shù)調用,挪而不能被壇同一程序淺其它文件蕩中的函數(shù)嗚調用,則哪稱為內部紀函數(shù)。定義一個瓣內部函數(shù)矮,只需在投函數(shù)類型毯前再加一境個“sta模tic”關鍵字稠即可,備定義格背式如下峰:stat殲ic函數(shù)類型衣函數(shù)名(函數(shù)參述數(shù)表){……}如sta遙tic賞in關tf淋un(獵a,b堡,c)影{……}6.7.保1外部函獅數(shù)在定義私函數(shù)時只,如果事沒有加逃關鍵字“sta象tic”,或者協(xié)冠以“exte打rn”,則表殘示此函數(shù)留是外部函串數(shù),其定忍義格式為紐奉:[ex晉ter洋n]函數(shù)類型淚函數(shù)名(函數(shù)參數(shù)分表){……}調用外部舞函數(shù)時,塌必須對被普調用的外隨部函數(shù)進坊行說明。例/*F井ILE蘿1*/#in歸clu城de<掀std膚io.素h>int挎i;史/*在FILE殘1中定義昏外部變躬量i*/voi副df富unc王();模/分*外部函折數(shù)說明墾*/mai儉n(){ i共=5;pri抓ntf蛙("f逢ile狹1:%慚d\n解",i借);func胞();}/*F鋤ILE歉2*/exte縱rni魂nti稻;/*外部變是量說明雖,F(xiàn)IL鴨E2引用FILE扔1中定義的登外部變量i*/voi舟df襪unc逝(){ p粉rin涌tf(跨"fi諷le2倦:%d尤\n"啦,i)懇;}該程序肉的運行碑結果是狹:fil悲e1:望5fil羅e2:膏56.8編譯預處燦理“編譯預璃處理”壇是C語言編譯呢系統(tǒng)的災一個組成妖部分。是歌在編譯前坦由編譯系石統(tǒng)中的預辱處理程序只對源程序薄的預處理魯命令進行蜂加工。源程序中市的預處理寧命令均以咬“#”開頭,唇結束不敵加分號甩,以區(qū)夏別源程枝序中的校語句,旺它們可晉以寫在駱程序中朋的任何沸位置,牌作用域址是自出辱現(xiàn)點到攏源程序期的末尾滑。預處理毀命令包餅括執(zhí)行舟宏定義(宏替換)、包含茅文件和膊條件編戚譯。一.宏定義簡單宏定瘋義1.一般形產(chǎn)式為:#def應ine宏名鐵串(宏體)如:莫#de亡fine袋PI耕3.磨1415唱9/*定義后,可以用PI來代替串3.14搶159*吉/2.宏定義的防作用在宏定義兄之后,該程序中匪宏名就代宮表了該字莊符串。說明:占單獨書校寫行語句尾烘不加分擊號3.說明①可以些用#un意def命令終日止宏定喇義的作搭用域。挨例如:#un落def旦P魔I②宏定義兵的嵌套厲使用#de廢fine珠R總3.0#d差efi液ne燙PI語3.湊141團592鳴6#d獨efi怪ne僵L喝2*P吉I*R辱/*宏體是腥表達式衫*/#d羅efi痰neSP偷I*R*坑Rmain社(){顛pri棋ntf廟("L=%f裹\nS=葉%f\n",2*PI籍*R,PI*R客*R);/*2*椒PI*R替換L,P少I*R*滑R替換S*雞/}t娘6-1程序運匪行結果脅如下:L=1慰8.8良495純56S=2重8.2秘743蓋33③雙引號衛(wèi)內與宏服同名的團字母不如作宏展喊開.mai恭n(雅){p哲rint輸f("L=%f狡\nS=克%f\n",L,S);}t6嗎-1#de岔fin素e達X涉5#de謀fin傍e掉Y寸X+1#de婚fin扮e舅Z譽Y*X橋/2main火(){int鐘a=Y宇;pri關ntf什("%橋d\n貍",Z糕);prin緞tf("振%d\n卻",--剪a);}t獎6-2//狡Z=Y顏*X/餅2=5趴+1*克5/2現(xiàn)=7運行結果哲:75帶參數(shù)肉的宏定磚義1.帶參數(shù)的孩宏定義的堪一般形式械為#d伶efi跡ne宏名(參數(shù)表沉)搶字魯符串#def熄ine干S(a,休b)闖((a)暈*(b)田)2.帶實參妹的宏名璃被展開宏名被社所定義革的宏體渾替換,宏體中的伴形參按從仗左到右的順序被實參替什換。例如:area還=S啊(3,決2);展開為:ar橫ea=刺((3歪)*(叉2));宏體及各侵形參外一序般應加括辜號()一般寫未成:#def護ine際PO辮WER品(x)((x)*(x))x=4;蔬y旨=6;z=P扭OWE驕R(x駐+y)鋪;宏展開:z=((呢x+y)看*(x+匠y));例#de型fin倡e麻PO磨WER暗(x)鑒x*xx=4;松y紛=6;z=PO再WER(艱x+y)左;宏展開征:z=x喂+y*瞞x+y磨;結果為臥:100結果為:34課堂練習芬:#in軋clu易de<織std貿(mào)io.馬h>#def沈ine陜MIN(京x,y)竹(x)自<(y)蝴?(x怪):(y舞)main撲(){in智ti,嫩j,k;旦i=屢10;j甲=15;k=1爹0*M佛IN(查i,跪j)索;pri塞ntf等("%些d\n虧",k預);}A)15驅B)10百0薄C)1面0裁D熟)150//1播0*i<找j?10巧*10將<15頑?(翠10)艱:(1補5)使用宏替幫換應注意先的問題(1)宏名與宏饒體之間用殊空格相隔只,宏名和項參數(shù)之間燒不能有空畏格;如有宏定障義:#de岡fin贊ef椅(繳x)午((x冷)–唉1)/*宏名f(x)中有空格量*/(2)宏名盡管半是字符串,但不能用間引號括起蹤蝶來(3)在宏定記義中結繪尾不能孩有分號宜”;”(4)宏定義中裝的參數(shù)盡波量用圓括著號括起來滴以免錯誤.(5)較長的宏論定義在一容行中寫不桿下時,要戰(zhàn)在本行結駱尾使用反兩斜杠表示吃續(xù)行。如:#de記fin歇eO決UTP爐UT拐pri貓ntf她(“螞Thi弊si捆sa槽ni利nte艱res賢tin蛾g\pro華gra之mw堂hic于ht蹲eac弱hes旅pe削pol倒eh修ow紗to殘use祝de肚fin闖e\com礙man析d”)為t6杯-3這是比鼻較特殊此的,因為在C語言中鞭一般情稀況下不掘需要有膽續(xù)行的籃標識,而預處查理是個媽例外。(6)宏定義絕可以寫渾在程序先中的任吊何地方座,但因涂其作用敏域為從灰定義之哈處到文雄件未尾賊,所以一轟定要寫免在程序悟引用該閱宏之前,通常寫墨在一個文典件之首。#def將ine裳MAX轎(x,y慎)方(x)>禽(y)?濫(x):迅(y)…….main周(){系in能t肺a,b生,c,悟d,t銅;…….t=M盆AX(盾a+b僻,c+弊d);……}t6劫-4宏展開:t=(a機+b)>右(c+d膀)?(a臭+b):摔(c+d播);例用艷宏定義和醉函數(shù)實現(xiàn)毯同樣的功符能int經(jīng)ma互x(in禾tx,不int啦y){r升etur咸n(x>禁y?x:紫y);}mai賢n(){后int阻a,b桂,c,d輩,t;…….t=ma欺x(a+典b,c+吳d);………}帶參的宏脅與函數(shù)區(qū)撕別帶參宏函數(shù)處理過程不分配內存簡單的字符置換分配內存先求實參值,再代入形參

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論