版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第6章函數(shù)與預(yù)處理命令張雪英C
語言程序設(shè)計第6章函數(shù)與預(yù)處理命令
6.1概述6.2函數(shù)的定義與調(diào)用6.3數(shù)組作函數(shù)參數(shù)6.4函數(shù)的嵌套調(diào)用和遞歸調(diào)用6.5局部變量和全局變量及其作用域6.6變量的存儲類別及變量的生存期6.7編譯預(yù)處理6.8多文件程序的調(diào)試方法6.1概述對于任何應(yīng)用程序來說都是由若干個程序模塊組成的,而每一個模塊常用來實現(xiàn)一個特定的功能。在C語言中就是利用函數(shù)來實現(xiàn)模塊功能的。學(xué)生成績管理系統(tǒng)
成績錄入成績查詢成績統(tǒng)計打印成績單6.1概述①程序結(jié)構(gòu)清晰,可讀性好。②減少重復(fù)編碼的工作量。③可多人共同編制一個大程序,縮短程序設(shè)計周期,提高程序設(shè)計和調(diào)試的效率。使用函數(shù)的好處……C程序源程序文件n函數(shù)1函數(shù)m……源程序文件1函數(shù)1函數(shù)n舉例說明:intcube(intx)/*函數(shù)定義*/{return(x*x*x);}main(){intf,n;printf(“請輸入一個數(shù):");scanf("%d",&n);f=cube(n);printf("%d*%d*%d=%d\n",n,n,n,f);}【例6-1】求一個數(shù)n的立方被調(diào)函數(shù)主調(diào)函數(shù)⑴一個C源程序可以由一個或多個源程序文件組成。C編譯系統(tǒng)在對C源程序進行編譯時是以文件為單位進行的。⑵一個C源程序文件可以由一個或多個函數(shù)組成。所有函數(shù)都是獨立的。主函數(shù)可以調(diào)用其它函數(shù),其它函數(shù)可以相互調(diào)用、自我調(diào)用。⑶在一個C程序中,有且僅有一個主函數(shù)main。C程序的執(zhí)行總是從main函數(shù)開始,調(diào)用其它函數(shù)后最終回到main函數(shù),在main函數(shù)中結(jié)束整個程序的運行。說明:6.2.1函數(shù)的分類函數(shù)的分類:
從用戶角度標(biāo)準(zhǔn)函數(shù)(庫函數(shù)):由系統(tǒng)提供用戶自定義函數(shù):int
cube(intx)從函數(shù)形式無參函數(shù):getchar()有參函數(shù):int
cube(intx)庫函數(shù)包括:--數(shù)學(xué)函數(shù):#include"math.h"--字符和字符串函數(shù):#include"string.h"#include"ctype.h"--輸入/輸出函數(shù):#include"stdio.h"使用庫函數(shù)應(yīng)注意:1、函數(shù)功能;2、函數(shù)參數(shù)的數(shù)目和順序,及各參數(shù)意義和類型;3、函數(shù)返回值意義和類型;4、需要使用的包含文件。6.2.2函數(shù)的定義函數(shù)定義的一般格式:
函數(shù)類型函數(shù)名(類型名形參1,…..){說明語句執(zhí)行語句
}例:求兩個數(shù)的最大值
intmax(intx,inty){intz;
z=(x>y)?x:y;return(z);}省略為int型如沒有,則為無參函數(shù)函數(shù)的定義函數(shù)也可以這樣定義,但不可這樣定義:intmax(x,y)intx,y;{intz;z=x>y?x:y;return(z);}intmax(x,y){intx,y;……}或intmax(intx,y){……}
或intmax(x,y)intx,y,z;{……..}
√注意:函數(shù)體可以為空,但{}不能省略。這種函數(shù)叫空函數(shù)不能在函數(shù)體內(nèi)再定義其他函數(shù),即函數(shù)不能嵌套定義。⑴函數(shù)類型即定義函數(shù)時函數(shù)返回值的類型,若定義時不指定函數(shù)類型,則隱含int型。⑵函數(shù)名是標(biāo)識符,不可省略。其的()不可省略⑶形式參數(shù)表列是用,分隔開的一組變量名。(4){}括起來的部分是函數(shù)體,{}不可省略。(5)形式參數(shù)中聲明的形式參數(shù),在函數(shù)體中不需要再說明,可直接使用。函數(shù)定義的說明:6.2.2函數(shù)的調(diào)用函數(shù)調(diào)用的一般形式:
函數(shù)名(實參表列);
-在C語言中,把函數(shù)調(diào)用作為一個表達式,因此凡是表達式可以出現(xiàn)的地方都可以出現(xiàn)函數(shù)調(diào)用。例:welcome();if(fabs(a)>max)max=fabs(a);m=max(c,max(a,b));intsum(){inti,t=0;for(i=1;i<=100;i++)t+=i;return(t);}main(){ints;s=sum();printf("%d\n",s);}intsum(intx){inti,t=0;for(i=1;i<=x;i++)t+=i;return(t);}main(){ints,a=100;s=sum(a);printf("%d\n",s);}【例6-2】求1~100的累加和。思考:兩個程序有何不同函數(shù)的調(diào)用舉例:main(){longs;intn;scanf(“%d”,&n);s=factor(n);printf("%d\n",s);}【例6-3】定義求階乘的函數(shù)factor。函數(shù)的調(diào)用舉例:longfactor(intx){longy=1;inti;for(i=1;i<=x;i++)y=y*i;return(y);}這個函數(shù)能單獨執(zhí)行嗎??函數(shù)的調(diào)用說明:函數(shù)調(diào)用說明:--實參與形參個數(shù)相等,類型一致,按順序?qū)?yīng)
--實參表求值順序,因系統(tǒng)而定(VC從右向左)voidmain(){inti=2,p;intf(inta,intb);p=f(i,++i);printf("%d",p);}intf(inta,intb){intc;if(a>b)c=1;elseif(a==b)c=0;elsec=-1;return(c);}程序運行結(jié)果:0形式參數(shù)與實際參數(shù)
--形式參數(shù):定義函數(shù)時函數(shù)名后面括號中的變量名
--實際參數(shù):調(diào)用函數(shù)時函數(shù)名后面括號中的表達式6.2.3函數(shù)的參數(shù)【例6-4】編一程序,將主函數(shù)中的兩個變量的值傳遞給swap函數(shù)中的兩個形參,交換兩個形參的值。voidswap(intx,inty){intz;z=x;x=y;y=z; printf("\nx=%d,y=%d",x,y);}main(){inta=10,b=20;swap(a,b);printf("\na=%d,b=%d\n",a,b);}函數(shù)的參數(shù)程序輸出結(jié)果:x=20,y=10a=10,b=20形式參數(shù)(形參)實際參數(shù)(實參)單向值傳遞【例6-4】編一程序,將主函數(shù)中的兩個變量的值傳遞給swap函數(shù)中的兩個形參,交換兩個形參的值。有關(guān)函數(shù)參數(shù)說明:
形參、實參的說明:
--形參與實參類型一致,個數(shù)相同;若類型不一致,自動按形參類型轉(zhuǎn)換--實參可以是常量、變量或表達式,但要求它們有確定的值--當(dāng)函數(shù)被調(diào)用時才給形參分配內(nèi)存單元。調(diào)用結(jié)束后,所占用的內(nèi)存單元被釋放。但實參單元仍保留并維持原值-----單向的值傳遞
--在VC中,實參的求值順序是從右向左
--函數(shù)的返回值,以定義函數(shù)時聲明的返回值為主。而不管return返回的是什么類型的數(shù)據(jù)
舉例:s(intr){return3.14*r*r;}main(){intr,area;scanf("%d",&r);printf("%d\n",s(r));}程序運行情況如下:212?【例6-5】計算并輸出圓的面積思考:若要得到單精度實型的圓面積,程序應(yīng)如何修改6.2.4函數(shù)的聲明函數(shù)的聲明:
--變量要先定義后使用,函數(shù)也如此。
--如調(diào)用在前,定義在后,則需要聲明函數(shù)聲明的形式:
類型名函數(shù)名(參數(shù)類型說明列表);
數(shù)據(jù)類型:必須與定義函數(shù)時的函數(shù)類型一致參數(shù)列表:可以省略形參名,但形參的類型、次序和數(shù)目必須一致函數(shù)聲明的例子:main(){floatadd(floatx,floaty);/*函數(shù)聲明*/floata,b,c;scanf(“%f,%f”,&a,&b);c=add(a,b);printf(“c=%f\n",c);}floatadd(floatx,floaty){floatz;z=x+y;return(z);}【例6-6】函數(shù)聲明的例子:函數(shù)的聲明:在下列情況下,可以省略函數(shù)聲明:
--當(dāng)函數(shù)的返回值為整型或字符型時,如果在同一個文件中即定義函數(shù),又調(diào)用該函數(shù),則不論定義函數(shù)與調(diào)用函數(shù)在源程序中的位置關(guān)系如何,都可以省去函數(shù)聲明。
--如果被調(diào)用函數(shù)的返回值不是整型或字符型,但函數(shù)定義和函數(shù)調(diào)用在同一個文件中,且函數(shù)定義在調(diào)用函數(shù)之前,則可以省去在調(diào)用函數(shù)中對被調(diào)用函數(shù)的聲明。swap()函數(shù)voidswap(intx,inty){intz;z=x;x=y;y=z; printf("\nx=%d,y=%d",x,y);}main(){inta=10,b=20;swap(a,b);printf("\na=%d,b=%d\n",a,b);}max()函數(shù)main(){inta,b,c;a=10;b=-3;c=max(a,b);…..}intmax(intx,inty){intx;x=(x>y)?x:y;returnx;}
函數(shù)聲明的例子:【例6-7】哥德巴赫猜想之一是任何一個大于5的偶數(shù)都可以表示為兩個素數(shù)之和。驗證這一論斷輸入n的值for(a=6;a<=n;a+=2)for(b=3;b<=a/2;b+=2)b是素數(shù)?TFc=a-bc是素數(shù)?TF輸出:a、b、c的值break;#include"math.h"intprime(intn);main(){inta,b,c,n;scanf("%d",&n);for(a=6;a<=n;a+=2)for(b=3;b<=a/2;b+=2) if(prime(b)){c=a-b;if(prime(c)){printf("%d=%d+%d\n",a,b,c);break;}}}程序如下:/*窮舉法判斷素數(shù)*/intprime(intn){inti,leap=1;for(i=2;i<=sqrt(n);i++)if(n%i==0){leap=0;break;}returnleap;}6.2.5函數(shù)的返回:從函數(shù)返回的兩種方法:
--用return語句從被調(diào)函數(shù)中退出,返回調(diào)用它的程序中(也稱為主調(diào)函數(shù))
--被調(diào)函數(shù)中如沒有return語句,則執(zhí)行到被調(diào)函數(shù)最外面的}
,返回主調(diào)函數(shù)。return的雙重作用
--控制程序從被調(diào)函數(shù)中退出,返回到主調(diào)函數(shù)中繼續(xù)執(zhí)行
--從被調(diào)函數(shù)向主調(diào)函數(shù)返回一個值函數(shù)的返回:intmax(intx,inty)
{
intz;
if(x>y)
z=x;
elsez=y;
return(z);}返回整型函數(shù)值返回不確定的函數(shù)值return;無返回語句在此返回函數(shù)的返回值:返回值規(guī)定:
--函數(shù)除去void
類型之外,均有一個返回值,返回值的類型就是在定義函數(shù)時說明的函數(shù)類型
--當(dāng)返回值類型為int
型時,在定義函數(shù)時可省去函數(shù)的數(shù)據(jù)類型定義說明
--對于返回值的類型為非整型的函數(shù),在定義函數(shù)時,必須明確地給出函數(shù)的數(shù)據(jù)類型說明返回語句的格式:
return;
或:return(表達式);6.3.1數(shù)組作函數(shù)參數(shù)數(shù)組名表示數(shù)組在內(nèi)存中的起始地址例:inta[5];a:數(shù)組在內(nèi)存中的起始地址,是常量
a[i]:數(shù)組元素a[0]a[1]a[2]a[3]a[4]數(shù)組作函數(shù)參數(shù)有兩種情況:
--數(shù)組元素作函數(shù)參數(shù)(單向的值傳遞)
--數(shù)組名作函數(shù)參數(shù)(地址傳遞)數(shù)組元素作函數(shù)參數(shù)舉例:voidswap(intx,inty){intz;z=x;x=y;y=z; }main(){inta[2]={1,2};swap(a[0],a[1]);printf("\na[0]=%d,a[1]=%d\n",a[0],a[1]);}【例6-8】數(shù)組元素作函數(shù)參數(shù):12a調(diào)用前a[0]a[1]12a調(diào)用a[0]a[1]12xy21xy交換12a返回數(shù)組元素作參數(shù):值傳遞數(shù)組名作函數(shù)參數(shù)數(shù)組名作函數(shù)參數(shù)---地址傳遞將數(shù)組在內(nèi)存中的地址作為參數(shù)傳遞給形參特點:
--形參與實參占用同樣的存儲單元
--“雙向”傳遞
--實參和形參必須是地址常量或變量
--實參和形參類型應(yīng)一致(維數(shù)相同、元素類型相同)--一維形參數(shù)組大小可不指定,多維數(shù)組則只可省略第一維的大小數(shù)組名作函數(shù)參數(shù)舉例:voidswap(intx[]){intz;z=x[0];x[0]=x[1];x[1]=z; }main(){inta[2]={1,2};swap(a);printf("\na[0]=%d,a[1]=%d\n",a[0],a[1]);}【例6-9】數(shù)組名作函數(shù)參數(shù):12a調(diào)用前12ax調(diào)用21ax交換21a返回數(shù)組名作參數(shù):地址傳遞數(shù)組名作函數(shù)參數(shù)舉例:voidsort(intx[],intn){inti,j,k,t;for(i=0;i<n-1;i++){k=i;for(j=i;j<n;j++)if(x[j]<x[k])k=j;if(k!=i){t=x[i];x[i]=x[k];x[k]=t;} }main(){inta[10],i;for(i=0;i<10;i++)scanf(“%d”,&a[i]);sort(a,10);for(i=0;i<10;i++)printf(“%5d”,a[i]);}【例6-10】數(shù)組的排序----選擇交換法排序:數(shù)組名作函數(shù)參數(shù)舉例:floataverage(floatarray[10]);voidmain(){floatscore[10],ave;inti;printf(“Input10scores:\n”);for(i=0;i<10;i++)scanf(“%f”,&score[i]);ave=average(score);printf(“Averageif:%.2f”,ave);}floataverage(floatarray[10]){inti;floataver,sum=0;for(i=0;i<10;i++)sum=sum+array[i]);aver=sum/10;returnaver;}【例6-11】求學(xué)生成績的平均值:..2109562312….….88scorearray實參用數(shù)組名形參用數(shù)組定義
floatarray[]數(shù)組名作函數(shù)參數(shù)舉例:intmax_value(intarray[3][4]){inti,j,max;max=array[0][0];for(i=0;i<3;i++)for(j=0;j<4;j++)if(array[i][j]>max)max=array[i][j];returnmax;}voidmain(){inta[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}};printf(“max=%d\n”,max_value(a));}【例6-12】求二維數(shù)組中最大元素值:多維形參數(shù)組第一維維數(shù)可省略,第二維必須相同
intarray[][4]6.4.1函數(shù)的嵌套調(diào)用:C規(guī)定,函數(shù)定義不可嵌套,但可以嵌套調(diào)用函數(shù)
main函數(shù){……
……
調(diào)用函數(shù)A;
……}函數(shù)A{…………
調(diào)用函數(shù)B;
……}函數(shù)B{……………………}調(diào)用調(diào)用返回返回函數(shù)嵌套調(diào)用舉例:intdif(intx,inty,intz);intmax(intx,inty,intz);intmin(intx,inty,intz);voidmain(){inta,b,c,d;
對a,b,c賦值d=dif(a,b,c);printf(“max-min=%d\n”,d);}【例6-13】求三個數(shù)中最大數(shù)與最小數(shù)的差值:intmin(intx,inty,intz){intr;r=x<y?x:y;return(r<z?r:z);}intmax(intx,inty,intz){intr;r=x>y?x:y;return(r>z?r:z);}intdif(intx,inty,intz){returnmax(x,y,z)-min(x,y,z);}6.4.2函數(shù)的遞歸調(diào)用遞歸調(diào)用的概念:
--一個函數(shù)直接或間接地調(diào)用了它本身,就稱為函數(shù)的遞歸調(diào)用。遞歸函數(shù):在函數(shù)體內(nèi)調(diào)用該函數(shù)本身例:intsub(intx){inty,z;…..if(…..)z=sub(y);else{…..}return;}直接調(diào)用sub函數(shù)本身遞歸函數(shù)的執(zhí)行過程:思路:以求4的階乘為例:4!=4*3!,3!=3*2!,2!=2*1!,1!=1,0!=1。遞歸結(jié)束條件:當(dāng)n=1或n=0時,n!=1。遞歸公式:n!=1(n=0,1)n×(n-1)!(n>1)【例6-14】編一遞歸函數(shù)求n!:遞歸調(diào)用過程
回推main()fact(4)fact(3)fact(2)fact(1){{{{{……………
y=fact(4);f=4*fact(3);f=3*fact(2);f=2*fact(1);f=1;
……………return24return6return2return1}}}}}
遞推
#include“stdio.h”main(){intn,l;scanf(“%d”,&n);l=fact(n);printf(“%d!=%d”,n,l);}intfact(intx){ints;if(x==1)s=1;elses=x*fact(x-1);returns;}程序如下:編制遞歸函數(shù)的方法:用遞歸方法解決問題必須滿足三個條件:
--可以把要解決的問題轉(zhuǎn)化為一個新問題,而這個新的問題的解決方法與原來的解決方法相同,只是處理的對象有規(guī)律地遞增或遞減
--可以應(yīng)用這個轉(zhuǎn)化過程使問題得到解決
--必須要有一個明確的結(jié)束遞歸的條件編寫遞歸程序的方法:
--建立遞歸模型
--找出遞歸結(jié)束條件遞歸函數(shù)舉例:xn=1(n=0)x×xn-1
(n>0)【例6-15】編一遞歸函數(shù)求xn:程序如下:longxn(intx,intn){longf=0;if(n<0)printf("n<0,dataerror!\n");elseif(n==0)f=1;elsef=x*xn(x,n-1);return(f);}main(){intn,x;longy;scanf("%d,%d",&x,&n);y=xn(x,n);printf("%ld\n",y);}程序運行情況如下:2,101024遞歸函數(shù)舉例:【例6-16】編一遞歸函數(shù)求整數(shù)n的八進制數(shù)形式:程序如下:voiddtoo(intx){intm;m=x%8;x=x/8;if(x!=0)dtoo(x);printf(“%d”,m);}main(){intn;scanf("%d",&n);printf("%d=(",n);dtoo(n);printf(")8\n");}程序運行情況如下:1561315613=(36375)8遞歸函數(shù)舉例:【例6-17】5個人坐一起,問第5個人多少歲?他說比第4個人大2歲,問第4個人多少歲?他說比第3個人大2歲。問第3個人多少歲?他說比第2個人大2歲。問第1個人多少歲?他說10歲。請問第5個人多大?intage(intn){intc;if(n==1)c=10;elsec=age(n-1)+2;returnc;}main(){printf(“%d\n“,age(5));}6.5變量的作用域與存儲方式:voidf1(){intt=2;a*=t;b/=t;}main(){inta,b;scanf(“%d,%d”,&a,&b);f1();printf(“a=%d,b=%d\n”,a,b);}【例6-18】分析程序的運行結(jié)果:編譯時,會出現(xiàn)錯誤信息提示:Undefinedsymbol‘a(chǎn)’和Undefinedsymbol‘b’。為什么?6.5.1變量的作用域概念:變量的作用域是指變量的有效使用范圍
char型
int型
float型
double型總結(jié):數(shù)據(jù)類型決定為變量分配的內(nèi)存單元的長度,數(shù)據(jù)的存放形式。(從程序設(shè)計角度看,決定了可以表示的數(shù)的范圍)問題:變量的有效作用范圍如何?6.5.1變量的作用域:分類:全局變量、局部變量
局部變量在一個函數(shù)內(nèi)部定義的變量,它只在本函數(shù)范圍內(nèi)有效,在此函數(shù)外不能使用的變量,又稱內(nèi)部變量主函數(shù)中定義的變量也是局部變量,只在主函數(shù)中有效不同函數(shù)中可以使用相同名字的局部變量,它們代表不同的對象,互不干擾;形參也屬于局部變量;在一個函數(shù)內(nèi)部的復(fù)合語句中定義的變量是局部變量,且只在本復(fù)合語句中有效。 變量的作用域:floatf1(inta)/*函數(shù)f1*/{intb,c;………}charf2(intx,inty)/*函數(shù)f2*/{inti,j;……}main()/*主函數(shù)*/{intm,n;………{inta,b;a=10;b=20;}}變量的作用域:
全局變量(又稱外部變量)在一個函數(shù)之外定義的變量,稱全局變量(全程變量或外部變量),其有效作用范圍為從定義變量的位置開始到本源文件結(jié)束。全局變量可以為本文件中其他函數(shù)共用。
全局變量的作用:增加函數(shù)間數(shù)據(jù)聯(lián)系的渠道
只有必要時(需要它傳遞數(shù)據(jù)時)才使用全局變量它占用存儲單元時間長,在程序運行全過程中都占存儲單元它使函數(shù)的通用性降低了,使用全局變量過多,會降低程序的清晰性變量的作用域:若在同一個源文件中,外部變量和局部變量同名,則在局部變量的作用范圍內(nèi),外部變量被“屏蔽”,即它不起作用inta=3,b=5;/*a、b為全局變量*/max(inta,intb)/*a、b為形式參數(shù),為局部變量*/{intc;c=a>b?a:b;return(c);}main(){inta=8;printf(“%d”,max(a,b));}6.6變量的存儲方式:變量的作用域:從變量的作用范圍來劃分變量的存儲方式:從變量的生存期來劃分變量的存儲方式:動態(tài)存儲、靜態(tài)存儲
靜態(tài)存儲:在程序運行期間分配固定的存儲空間,一直到程序運行結(jié)束為止。占靜態(tài)存儲區(qū)分配動態(tài)存儲:在程序運行期間根據(jù)需要進行動態(tài)的分配存儲空間,一旦需要結(jié)束,則立刻釋放占據(jù)的內(nèi)存空間。占動態(tài)存儲區(qū)存放變量的存儲類別:autostaticexternregister6.6.1auto變量:變量說明的一般形式:
存儲類別數(shù)據(jù)類型變量名1,變量名2…;例:autointa,b;staticfloatx;auto變量:
自動變量是最常見的一類變量說明符“auto”可以省略。按照這種默認的規(guī)定,以前所使用的全部變量都是自動變量。6.6.2auto變量:auto變量:
自動變量必須在一個函數(shù)體的內(nèi)部,形參也是自動變量。自動變量屬動態(tài)存儲方式(類別),占動態(tài)存儲區(qū)空間,函數(shù)調(diào)用結(jié)束后即釋放。自動變量的作用域是在所說明的函數(shù)內(nèi)部,實質(zhì)上是一個函數(shù)內(nèi)部的局部變量。只有在函數(shù)被調(diào)用時才存在,從函數(shù)中返回時即消失,它們的值也僅限于說明它的函數(shù),在其他的函數(shù)中不能存取。由于自動變量具有局部性,所以在兩個不同函數(shù)中可以分別使用同名的變量而互不影響。變量的存儲方式舉例:main()/*主函數(shù)*/{intx=1;voidf1(void),f2(int);f1();f2(x);printf(“x=%d\n,”x);}voidf1(void){intx=3;printf(“x=%d\n,”x);}voidf2(intx){printf(“x=%d\n,”++x);}【例6-19】分析程序的運行結(jié)果:6.6.2變量的存儲方式—靜態(tài)局部變量:static變量:靜態(tài)局部變量、靜態(tài)外部變量
靜態(tài)局部變量用“static”進行聲明例:main(){staticinta;
intb;….}靜態(tài)局部變量屬靜態(tài)存儲類別,占靜態(tài)存儲區(qū),在程序整個運行期間都不釋放。靜態(tài)局部變量是在編譯時賦初值,即只賦初值一次,以后每次調(diào)用函數(shù)時不再重新賦初值而只保留上次函數(shù)調(diào)用結(jié)束時的值。6.6.2靜態(tài)局部變量:static變量:靜態(tài)局部變量、靜態(tài)外部變量
靜態(tài)局部變量與auto變量的區(qū)別:靜態(tài)局部變量在每次調(diào)用的過程中能夠保持?jǐn)?shù)據(jù)的連續(xù)性(即保留上次函數(shù)調(diào)用結(jié)束時的值);而自動變量不能。若在定義static變量時未賦初值,其初值為0(對數(shù)據(jù)型變量)或空字符(對字符變量);而對auto自動變量來說,其初值不確定。變量的存儲方式舉例:main(){voidinc1(),inc2();inc1();inc1();inc1();inc2();inc2();inc2();}voidinc1(){intx=0;x++;printf(“inc1x=%d\n,”x);}voidinc2(){staticintx=0;x++;printf(“inc2x=%d\n,”x);}【例6-20】分析程序的運行結(jié)果:注意:當(dāng)多次調(diào)用函數(shù)時往往弄不清靜態(tài)局部變量當(dāng)前值是什么,因此,如不必要,不要多用靜態(tài)局部變量變量的存儲方式舉例:intf(inta){autointb=0;staticintc=3;b=b+1;c=c+1;returna+b+c;}main(){inta=2,i;for(i=0;i<3;i++)printf(“%d”,f(a));}【例6-21】分析靜態(tài)局部變量的值:第一次調(diào)用開始03bc第一次調(diào)用結(jié)束1404第二次調(diào)用開始7896.6.2靜態(tài)外部變量:static變量:靜態(tài)局部變量、靜態(tài)外部變量
靜態(tài)外部變量:在定義外部變量時加一個static聲明后,此變量就只能被本文件引用,而不能被其他文件引用,這樣的變量叫靜態(tài)外部變量例:inta;/*外部變量*/staticintb;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版新能源車充電樁大清包建設(shè)合同樣本3篇
- 二零二五年度搬家服務(wù)與家居綠化設(shè)計合同2篇
- 二零二五年住宅小區(qū)代建及物業(yè)管理服務(wù)合同書3篇
- 二零二五年度快遞包裹運輸及快遞末端服務(wù)合同3篇
- 二零二五年度房地產(chǎn)企業(yè)合同財務(wù)風(fēng)險防范與合同審查合同3篇
- 二零二五年度智慧能源管理系統(tǒng)安裝合同6篇
- 二零二五年度學(xué)校藝術(shù)團隊建設(shè)合同3篇
- 2025年度白酒行業(yè)市場調(diào)研與分析合同6篇
- 海南職業(yè)技術(shù)學(xué)院《模擬電子技術(shù)英文》2023-2024學(xué)年第一學(xué)期期末試卷
- 二零二五年度大學(xué)生實習(xí)期間實習(xí)單位實習(xí)成果轉(zhuǎn)化服務(wù)合同3篇
- 2024年醫(yī)療器械經(jīng)營質(zhì)量管理規(guī)范培訓(xùn)課件
- CNAS質(zhì)量體系文件(質(zhì)量手冊程序文件)
- 安徽省血液凈化??谱o士臨床培訓(xùn)基地條件
- 建筑消防設(shè)施檢測誠信承諾書
- ojt問答題未升版ojt204
- 五年級語文滲透法制教育滲透點教案呈現(xiàn)
- 凱普21種基因型HPV分型與其它比較
- 小學(xué)數(shù)學(xué)小專題講座《數(shù)學(xué)教學(xué)生活化 》(課堂PPT)
- 雞場養(yǎng)殖情況記錄登記表
- 高壓配電柜系列產(chǎn)品出廠檢驗規(guī)范
- 節(jié)流孔板孔徑計算
評論
0/150
提交評論