




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第7講
函
數(shù)C語言是通過函數(shù)來實現(xiàn)模塊化程序設計的。所以較大的C語言應用程序,往往由一個主函數(shù)和若干個函數(shù)組成。由主函數(shù)調用其它函數(shù),其它函數(shù)也可以相互調用。同一個函數(shù)可以被一個或多個函數(shù)調用任意多次。7.1函數(shù)的定義與調用7.2函數(shù)的嵌套調用與遞歸調用7.3數(shù)組作為函數(shù)參數(shù)7.4內(nèi)部變量與外部變量7.5變量的動態(tài)存儲與靜態(tài)存儲
[Return]7.1函數(shù)的定義與調用7.1.1函數(shù)的定義7.1.2函數(shù)的返回值與函數(shù)類型7.1.3對被調用函數(shù)的說明和函數(shù)原型7.1.4函數(shù)的調用7.1.5函數(shù)的形參與實參[Return]7.1.1函數(shù)的定義1.任何函數(shù)(包括主函數(shù)main())都是由函數(shù)說明和函數(shù)體兩部分組成。根據(jù)函數(shù)是否需要參數(shù),可將函數(shù)分為無參函數(shù)和有參函數(shù)兩種。(1)無參函數(shù)的一般形式
函數(shù)類型函數(shù)名(void){說明語句部分;
可執(zhí)行語句部分;
}注意:在舊標準中,函數(shù)可以缺省參數(shù)表。但在新標準中,函數(shù)不可缺省參數(shù)表;如果不需要參數(shù),則用“void”表示,主函數(shù)main()例外。(2)有參函數(shù)的一般形式函數(shù)類型函數(shù)名(數(shù)據(jù)類型參數(shù)[,數(shù)據(jù)類型參數(shù)2……]){說明語句部分;
可執(zhí)行語句部分;
}有參函數(shù)比無參函數(shù)多了一個參數(shù)表。調用有參函數(shù)時,調用函數(shù)將賦予這些參數(shù)實際的值。為了與調用函數(shù)提供的實際參數(shù)區(qū)別開,將函數(shù)定義中的參數(shù)表稱為形式參數(shù)表,簡稱形參表。[案例7.1]定義一個函數(shù),用于求兩個數(shù)中的大數(shù)。/*案例代碼文件名:AL7_1.C功能:定義一個求較大數(shù)的函數(shù)并在主函數(shù)中調用*/#include<stdio.h>int
max(intn1,intn2) /*定義一個函數(shù)max()*/{intc;if(n1>n2)c=n1;elsec=n2;returnc;}main(){intnum1,num2,nmax;;
printf("inputtwonumbers:\n");
scanf("%d%d",&num1,&num2);
nmax=max(num1,num2);
printf("max=%d\n",nmax);}return(n1>n2?n1:n2);2.說明(1)函數(shù)定義不允許嵌套。在C語言中,所有函數(shù)(包括主函數(shù)main())都是平行的。一個函數(shù)的定義,可以放在程序中的任意位置,主函數(shù)main()之前或之后。但在一個函數(shù)的函數(shù)體內(nèi),不能再定義另一個函數(shù),即不能嵌套定義。(2)空函數(shù)──既無參數(shù)、函數(shù)體又為空的函數(shù)。其一般形式為:[函數(shù)類型]函數(shù)名(void){}[Return]7.1.2函數(shù)的返回值與函數(shù)類型C語言的函數(shù)兼有其它語言中的函數(shù)和過程兩種功能,從這個角度看,又可把函數(shù)分為有返回值函數(shù)和無返回值函數(shù)兩種。1.函數(shù)返回值與return語句有參函數(shù)的返回值,是通過函數(shù)中的return語句來獲得的。(1)return語句的一般格式:return(返回值表達式);
(2)return語句的功能:返回調用函數(shù),并將“返回值表達式”的值帶給調用函數(shù)。注意:調用函數(shù)中無return語句,并不是不返回一個值,而是一個不確定的值。為了明確表示不返回值,可以用“void”定義成“無(空)類型”。2.函數(shù)類型在定義函數(shù)時,對函數(shù)類型的說明,應與return語句中、返回值表達式的類型一致。如果不一致,則以函數(shù)類型為準。如果缺省函數(shù)類型,則系統(tǒng)一律按整型處理。良好的程序設計習慣:為了使程序具有良好的可讀性并減少出錯,凡不要求返回值的函數(shù)都應定義為空類型;即使函數(shù)類型為整型,也不使用系統(tǒng)的缺省處理。[Return]7.1.3對被調用函數(shù)的說明和函數(shù)原型在ANSIC新標準中,采用函數(shù)原型方式,對被調用函數(shù)進行說明,其一般格式如下:函數(shù)類型函數(shù)名(數(shù)據(jù)類型[參數(shù)名][,數(shù)據(jù)類型[參數(shù)名2]…]);
C語言同時又規(guī)定,在以下2種情況下,可以省去對被調用函數(shù)的說明:(1)當被調用函數(shù)的函數(shù)定義出現(xiàn)在調用函數(shù)之前時。因為在調用之前,編譯系統(tǒng)已經(jīng)知道了被調用函數(shù)的函數(shù)類型、參數(shù)個數(shù)、類型和順序。(2)如果在所有函數(shù)定義之前,在函數(shù)外部(例如文件開始處)預先對各個函數(shù)進行了說明,則在調用函數(shù)中可缺省對被調用函數(shù)的說明。[Return]7.1.4函數(shù)的調用
在程序中,是通過對函數(shù)的調用來執(zhí)行函數(shù)體的,其過程與其它語言的子程序調用相似。C語言中,函數(shù)調用的一般形式為:函數(shù)名([實際參數(shù)表])
切記:實參的個數(shù)、類型和順序,應該與被調用函數(shù)所要求的參數(shù)個數(shù)、類型和順序一致,才能正確地進行數(shù)據(jù)傳遞。在C語言中,可以用以下幾種方式調用函數(shù):(1)函數(shù)表達式。函數(shù)作為表達式的一項,出現(xiàn)在表達式中,以函數(shù)返回值參與表達式的運算。這種方式要求函數(shù)是有返回值的。(2)函數(shù)語句。C語言中的函數(shù)可以只進行某些操作而不返回函數(shù)值,這時的函數(shù)調用可作為一條獨立的語句。(3)函數(shù)實參。函數(shù)作為另一個函數(shù)調用的實際參數(shù)出現(xiàn)。這種情況是把該函數(shù)的返回值作為實參進行傳送,因此要求該函數(shù)必須是有返回值的。7.1.5函數(shù)的形參與實參函數(shù)的參數(shù)分為形參和實參兩種,作用是實現(xiàn)數(shù)據(jù)傳送。形參出現(xiàn)在函數(shù)定義中,只能在該函數(shù)體內(nèi)使用。發(fā)生函數(shù)調用時,調用函數(shù)把實參的值復制1份,傳送給被調用函數(shù)的形參,從而實現(xiàn)調用函數(shù)向被調用函數(shù)的數(shù)據(jù)傳送。
[案例7.3]實參對形參的數(shù)據(jù)傳遞。/*實參對形參的數(shù)據(jù)傳遞。*//*案例代碼文件名:AL7_3.C*/#include<stdio.h>voidmain(){voids(intn);/*說明函數(shù)*/
intn=100;/*定義實參n,并初始化*/s(n);/*調用函數(shù)*/
printf("n_s=%d\n",n);/*輸出調用后實參的值,便于進行比較*/}voids(intn){inti;
printf("n_x=%d\n",n);/*輸出改變前形參的值*/for(i=n-1;i>=1;i--)n=n+i;/*改變形參的值*/
printf("n_x=%d\n",n);/*輸出改變后形參的值*/} [程序演示]說明:(1)實參可以是常量、變量、表達式、函數(shù)等。無論實參是何種類型的量,在進行函數(shù)調用時,它們都必須具有確定的值,以便把這些值傳送給形參。因此,應預先用賦值、輸入等辦法,使實參獲得確定的值。(2)形參變量只有在被調用時,才分配內(nèi)存單元;調用結束時,即刻釋放所分配的內(nèi)存單元。因此,形參只有在該函數(shù)內(nèi)有效。調用結束,返回調用函數(shù)后,則不能再使用該形參變量。(3)實參對形參的數(shù)據(jù)傳送是單向的,即只能把實參的值傳送給形參,而不能把形參的值反向地傳送給實參。(4)實參和形參占用不同的內(nèi)存單元,即使同名也互不影響。[Return]7.2函數(shù)的嵌套調用和遞歸調用7.2.1函數(shù)的嵌套調用
函數(shù)的嵌套調用是指,在執(zhí)行被調用函數(shù)時,被調用函數(shù)又調用了其它函數(shù)。這與其它語言的子程序嵌套調用的情形是類似的,其關系可表示如圖7-1。[案例7.4]計算s=1k+2k+3k+……+Nk/*案例代碼文件名:AL7_4.C功能:函數(shù)的嵌套調用*/#include<stdio.h>#defineK4#defineN5longf1(intn,intk) /*計算n的k次方*/{longpower=n;inti;for(i=1;i<k;i++)power*=n;returnpower;}longf2(intn,intk) /*計算1到n的k次方之累加和*/{longsum=0;
inti;
for(i=1;i<=n;i++)sum+=f1(i,k);returnsum;}main(){printf("Sumof%dpowersofintegersfrom1to%d=",K,N);printf("%d\n",f2(N,K));}7.2.2函數(shù)的遞歸調用
函數(shù)的遞歸調用是指,一個函數(shù)在它的函數(shù)體內(nèi),直接或間接地調用它自身。C語言允許函數(shù)的遞歸調用。在遞歸調用中,調用函數(shù)又是被調用函數(shù),執(zhí)行遞歸函數(shù)將反復調用其自身。每調用一次就進入新的一層。為了防止遞歸調用無終止地進行,必須在函數(shù)內(nèi)有終止遞歸調用的手段。常用的辦法是加條件判斷,滿足某種條件后就不再作遞歸調用,然后逐層返回。理解“回推”和“遞推”過程。[案例7.5]用遞歸法計算n!。/*功能:通過函數(shù)的遞歸調用計算階乘*/#include<stdio.h>longpower(intn){longf;if(n>1)f=power(n-1)*n;elsef=1;return(f);}main(){intn;longy;
printf("inputainteagernumber:\n");scanf("%d",&n);y=power(n);
printf("%d!=%ld\n",n,y);} [程序演示]典型的古典問題:Hanoi塔問題(課下理解)[Return]2007年4月1、在C語言中,函數(shù)返回值的類型最終取決于()
A)函數(shù)定義時在函數(shù)首部所說明的函數(shù)類型
B)return語句中表達式值的類型
C)調用函數(shù)時主函數(shù)所傳遞的實參類型
D)函數(shù)定義時形參的類型2007年9月1、若函數(shù)調用時的實參為變量時,以下關于函數(shù)形參和實參的敘述中正確的是A)函數(shù)的實參和其對應的形參共占同一存儲單元B)形參只是形式上的存在,不占用具體存儲單元C)同名的實參和形參占同一存儲單元D)函數(shù)的形參和實參分別占用不同的存儲單元2008年4月1、有以下程序
#include<stdio.h>
int
f(int
x)
{
int
y;
if(x==0||x==1)
return(3);
y=x*x-f(x-2);
return
y;
}
main()
{
int
z;
z=f(3);
printf("%d\n",z);
}程序的運行結果是A)0
B)9
C)6
D)82008年4月2、以下程序的輸出結果是【13】。
#include<stdio.h>
void
fun(int
x)
{
if(x/2>0)
fun(x/2);
printf("%d",x);
}
main()
{
fun(3);
printf("\n");
}132008年9月1、下面的函數(shù)調用語句中func函數(shù)的實參個數(shù)是
func(f2(v1,v2),(v3,v4,v5),(v6,max(v7,v8)));
A)3
B)4
C)5
D)82、有以下程序
#include<stdio.h>
int
fun(int
a,int
b)
{
if(b==0)
return
a;
else
return(fun(--a,--b));
}
main()
{
printf("%d\n",fun(4,2));
}程序的運行結果是
A)1
B)2
C)3
D)42008年9月3、以下敘述中錯誤的是A)用戶定義的函數(shù)中可以沒有return語句B)用戶定義的函數(shù)中可以有多個return語句,以便可以調用一次返回多個函數(shù)值C)用戶定義的函數(shù)中若沒有return語句,則應當定義函數(shù)為void類型D)函數(shù)的return語句中可以沒有表達式2009年3月1、有以下程序#include<stdio.h>int
f(int
x,int
y){
return
((y-x)*x);}main(){
int
a=3,b=4,c=5,d;
d=f(f(a,b),f(a,c));
printf("%d\n",d);}程序運行后的輸出結果是A)10B)9C)8D)72009年3月2、有以下程序#include<stdio.h>int
fun(int
x,int
y){
if(x==y)
return
(x);
else
return((x+y)/2);}main(){
int
a=4,b=5,c=6;
printf("%d\n",fun(2*a,fun(b,c)));}程序運行后的輸出結果是A)3B)6C)8D)122009年9月1、有以下程序#include
<stdio.h>void
fun(int
p){
int
d=2;
p=d++;
printf("%d",p);}main(){
int
a=1;
fun(a);
printf("%d\n",a);}程序運行后的輸出結果是A)32B)12C)21D)222009年9月2、有以下程序#include<stdio.h>fun(int
x){
if(x/2>0)
fun(x/2);
printf("%d
",x);}main(){
fun(6);printf("\n");}程序運行后的輸出結果是【】136題盤練習-注意函數(shù)類型、參數(shù)類型:1-2、7-1、22-2、77-2、78-2、93-2、97-2、98-2函數(shù)遞歸調用:6-2(斐波拉契數(shù)列)、27-2(迭代法)、52-2、58-2(求階乘)嵌套調用:21-2、43-2(二分法)、99-17.3數(shù)組作為函數(shù)參數(shù)數(shù)組用作函數(shù)參數(shù)有兩種形式:一種是把數(shù)組元素(又稱下標變量)作為實參使用;另一種是把數(shù)組名作為函數(shù)的形參和實參使用。7.3.1數(shù)組元素作為函數(shù)參數(shù)7.3.2數(shù)組名作為函數(shù)的形參和實參[Return]7.3.1數(shù)組元素作為函數(shù)參數(shù)
數(shù)組元素就是下標變量,它與普通變量并無區(qū)別。數(shù)組元素只能用作函數(shù)實參,其用法與普通變量完全相同:在發(fā)生函數(shù)調用時,把數(shù)組元素的值傳送給形參,實現(xiàn)單向值傳送。[案例7.6]寫一函數(shù),統(tǒng)計字符串中字母的個數(shù)。/*案例代碼文件名:AL7_6.C*//*功能:數(shù)組元素作為函數(shù)實參*/#include<stdio.h>int
isalp(charc)
{if(c>='a'&&c<='z'||c>='A'&&c<='Z')return(1);elsereturn(0);}main(){inti,num=0; charstr[255];
printf("Inputastring:");
gets(str); for(i=0;str[i]!='\0';i++) if(isalp(str[i]))num++;
puts(str);
printf("num=%d\n",num);} [程序演示]說明:(1)用數(shù)組元素作實參時,只要數(shù)組類型和函數(shù)的形參類型一致即可,并不要求函數(shù)的形參也是下標變量。換句話說,對數(shù)組元素的處理是按普通變量對待的。(2)在普通變量或下標變量作函數(shù)參數(shù)時,形參變量和實參變量是由編譯系統(tǒng)分配的兩個不同的內(nèi)存單元。在函數(shù)調用時發(fā)生的值傳送,是把實參變量的值賦予形參變量。[Return]7.3.2數(shù)組名作為函數(shù)的形參和實參數(shù)組名作函數(shù)參數(shù)時,既可以作形參,也可以作實參。數(shù)組名作函數(shù)參數(shù)時,要求形參和相對應的實參都必須是類型相同的數(shù)組(或指向數(shù)組的指針變量),都必須有明確的數(shù)組說明[案例7.7]已知某個學生5門課程的成績,求平均成績。/*案例代碼文件名:AL7_7.C*/floataver(floata[])/*求平均值函數(shù)*/{inti;
floatav,s=0;
for(i=0;i<5;i++)s+=a[i];
av=s/5;
returnav;
}voidmain(){floatsco[5],av;
inti;
printf("\ninput5scores:\n");
for(i=0;i<5;i++)scanf("%f",&sco[i]);
av=aver(sco);/*調用函數(shù),實參為一數(shù)組名*/
printf("averagescoreis%5.2f\n",av);
} [程序演示]進一步:思考1:將函數(shù)aver改寫成通用的求n個數(shù)的平均數(shù)?
floataver(floata[],intn)
調用處改為:av=aver(sco
,5);
思考2:如果在函數(shù)aver中改變了數(shù)組的值,調用函數(shù)中是否隨之變化?元素起始地址a[0]
1000a[1]
1002a[2]
1004a[3]
1006a[i]
1008
a[5]
1010a[6]
1012a[7]
1014a[8]
1016a[9]
1018a
數(shù)組
元素起始地址sco[0]
1000sco[1]
1002sco[2]
1004sco[3]
1006sco[i]
1008
sco5]
1010sco[6]
1012sco[7]
1014sco[8]
1016sco[9]
1018說明:(1)用數(shù)組名作函數(shù)參數(shù),應該在調用函數(shù)和被調用函數(shù)中分別定義數(shù)組,且數(shù)據(jù)類型必須一致,否則結果將出錯。例如,在本案例中,形參數(shù)組為a[],實參數(shù)組為sco[],它們的數(shù)據(jù)類型相同。(2)C編譯系統(tǒng)對形參數(shù)組大小不作檢查,所以形參數(shù)組可以不指定大小。例如,本案例中的形參數(shù)組a[]。
[Return]7.4內(nèi)部變量與外部變量
C語言中所有的變量都有自己的作用域。變量說明的位置不同,其作用域也不同,據(jù)此將C語言中的變量分為內(nèi)部變量和外部變量。7.4.1內(nèi)部變量7.4.2外部變量[Return]7.4.1內(nèi)部變量在一個函數(shù)內(nèi)部說明的變量是內(nèi)部變量,它只在該函數(shù)范圍內(nèi)有效。也就是說,只有在包含變量說明的函數(shù)內(nèi)部,才能使用被說明的變量,在此函數(shù)之外就不能使用這些變量了。所以內(nèi)部變量也稱“局部變量”。例如:intf1(inta)/*函數(shù)f1*/{intb,c;
……} /*a,b,c作用域:僅限于函數(shù)f1()中*/
intf2(intx)/*函數(shù)f2*/{inty,z;
……} /*x,y,z作用域:僅限于函數(shù)f2()中*/
main(){intm,n;
……} /*m,n作用域:僅限于函數(shù)main()中*/關于局部變量的作用域還要說明以下幾點:1.主函數(shù)main()中定義的內(nèi)部變量,也只能在主函數(shù)中使用,其它函數(shù)不能使用。同時,主函數(shù)中也不能使用其它函數(shù)中定義的內(nèi)部變量。因為主函數(shù)也是一個函數(shù),與其它函數(shù)是平行關系。這一點是與其它語言不同的,應予以注意。2.形參變量也是內(nèi)部變量,屬于被調用函數(shù);實參變量,則是調用函數(shù)的內(nèi)部變量。3.允許在不同的函數(shù)中使用相同的變量名,它們代表不同的對象,分配不同的單元,互不干擾,也不會發(fā)生混淆。4.在復合語句中也可定義變量,其作用域只在復合語句范圍內(nèi)。[Return]7.4.2外部變量在函數(shù)外部定義的變量稱為外部變量。以此類推,在函數(shù)外部定義的數(shù)組就稱為外部數(shù)組。外部變量不屬于任何一個函數(shù),其作用域是:從外部變量的定義位置開始,到本文件結束為止。外部變量可被作用域內(nèi)的所有函數(shù)直接引用,所以外部變量又稱全局變量。
[案例7.9]輸入長方體的長(l)、寬(w)、高(h),求長方體體積及正、側、頂三個面的面積。/*功能:利用全局變量計算長方體的體積及三個面的面積*/ints1,s2,s3;int
vs(int
a,int
b,intc){intv; v=a*b*c;s1=a*b;s2=b*c;s3=a*c; returnv;}main(){intv,l,w,h;
printf("\ninputlength,widthandheight:");
scanf("%d%d%d",&l,&w,&h);v=vs(l,w,h);
printf("v=%ds1=%ds2=%ds3=%d\n",v,s1,s2,s3);} [程序演示]對于全局變量還有以下幾點說明:(1)在同一源文件中,允許外部變量和內(nèi)部變量同名。在內(nèi)部變量的作用域內(nèi),外部變量將被屏蔽而不起作用。(2)外部變量的作用域是從定義點到本文件結束。如果定義點之前的函數(shù)需要引用這些外部變量時,需要在函數(shù)內(nèi)對被引用的外部變量進行說明。外部變量說明的一般形式為:extern數(shù)據(jù)類型外部變量[,外部變量2……];
注意:外部變量的定義和外部變量的說明是兩回事。外部變量的定義,必須在所有的函數(shù)之外,且只能定義一次。而外部變量的說明,出現(xiàn)在要使用該外部變量的函數(shù)內(nèi),而且可以出現(xiàn)多次。[案例7.10]外部變量的定義與說明。/*案例代碼文件名:AL7_10.C*/int
vs(int
xl,int
xw){externint
xh;/*外部變量xh的說明*/
intv;
v=xl*xw*xh;/*直接使用外部變量xh的值*/returnv;
}main(){externint
xw,xh;/*外部變量的說明*/
intxl=5;/*內(nèi)部變量的定義*/
printf("xl=%d,xw=%d,xh=%d\nv=%d",xl,xw,xh,vs(xl,xw));
}intxl=3,xw=4,xh=5;/*外部變量xl、xw、xh的定義*/ [程序演示][Return]7.5變量的動態(tài)存儲與靜態(tài)存儲簡介
在C語言中,對變量的存儲類型說明有以下四種:自動變量(auto)、寄存器變量(register)、外部變量(extern)、靜態(tài)變量(static)。自動變量和寄存器變量屬于動態(tài)存儲方式,外部變量和靜態(tài)內(nèi)部變量屬于靜態(tài)存儲方式。7.5.1
內(nèi)部變量的存儲方式7.5.2外部變量的存儲方式[Return]7.5.1內(nèi)部變量的存儲方式
1.靜態(tài)存儲──靜態(tài)內(nèi)部變量(1)定義格式:static數(shù)據(jù)類型內(nèi)部變量表;(2)存儲特點1)靜態(tài)內(nèi)部變量屬于靜態(tài)存儲。在程序執(zhí)行過程中,即使所在函數(shù)調用結束也不釋放。換句話說,在程序執(zhí)行期間,靜態(tài)內(nèi)部變量始終存在,但其它函數(shù)是不能引用它們的。2)定義但不初始化,則自動賦以"0"(整型和實型)或'\0'(字符型);且每次調用它們所在的函數(shù)時,不再重新賦初值,只是保留上次調用結束時的值!2.動態(tài)存儲──自動局部變量(又稱自動變量)(1)定義格式:[auto]數(shù)據(jù)類型變量表;
(2)存儲特點1)自動變量屬于動態(tài)存儲方式。在函數(shù)中定義的自動變量,只在該函數(shù)內(nèi)有效;函數(shù)被調用時分配存儲空間,調用結束就釋放。2)定義而不初始化,則其值是不確定的。如果初始化,則賦初值操作是在調用時進行的,且每次調用都要重新賦一次初值。3)由于自動變量的作用域和生存期,都局限于定義它的個體內(nèi)(函數(shù)或復合語句),因此不同的個體中允許使用同名的變量而不會混淆。即使在函數(shù)內(nèi)定義的自動變量,也可與該函數(shù)內(nèi)部的復合語句中定義的自動變量同名。[案例7.13]自動變量與靜態(tài)局部變量的存儲特性。/*案例代碼文件名:AL7_13.C*/voidauto_static(void){inta=0; /*自動變量:每次調用都重新初始化*/staticintb=0; /*靜態(tài)局部變量:只初始化1次*/
printf(“%d,%d\n”,a,b);++a;++b;}main(){inti;for(i=0;i<5;i++)auto_static();} [程序演示]7.5.2外部變量的存儲方式外部變量屬于靜態(tài)存儲方式:(1)靜態(tài)外部變量──只允許被本源文件中的函數(shù)引用其定義格式為:static數(shù)據(jù)類型外部變量表;(2)非靜態(tài)外部變量──允許被其它源文件中的函數(shù)引用定義時缺省static關鍵字的外部變量,即為非靜態(tài)外部變量。其它源文件中的函數(shù),引用非靜態(tài)外部變量時,需要在引用函數(shù)所在的源文件中進行說明:
extern數(shù)據(jù)類型外部變量表;注意:在函數(shù)內(nèi)的extern變量說明,表示引用本源文件中的外部變量!而函數(shù)外(通常在文件開頭)的extern變量說明,表示引用其它文件中的外部變量。靜態(tài)局部變量和靜態(tài)外部變量同屬靜態(tài)存儲方式,但兩者區(qū)別較大:(1)定義的位置不同。靜態(tài)局部變量在函數(shù)內(nèi)定義,靜態(tài)外部變量在函數(shù)外定義。(2)作用域不同。靜態(tài)局部變量屬于內(nèi)部變量,其作用域僅限于定義它的函數(shù)內(nèi);雖然生存期為整個源程序,但其它函數(shù)是不能使用它的。靜態(tài)外部變量在函數(shù)外定義,其作用域為定義它的源文件內(nèi);生存期為整個源程序,但其它源文件中的函數(shù)也是不能使用它的。(3)初始化處理不同。靜態(tài)局部變量,僅在第1次調用它所在的函數(shù)時被初始化,當再次調用定義它的函數(shù)時,不再初始化,而是保留上1次調用結束時的值。而靜態(tài)外部變量是在函數(shù)外定義的,不存在靜態(tài)內(nèi)部變量的“重復”初始化問題,其當前值由最近1次給它賦值的操作決定。
2007年4月1、有以下程序inta=4;int
f(intn){intt=0;staticinta=5;if(n%2){inta=6;t+=a++;}
else{inta=7;t+=a++;}returnt+a++;}main(){ints=a,i=0;
for(;i<2;i++)s+=f(i);
printf(“%d\n”,s);}程序運行后的輸出結果是()A)24
B)28
C)32
D)362007年4月2、以下程序的運行結果是__________________。
intk=0;
voidfun(intm)
{m+=k;k+=m;printf(“m=%dk=%d”,m,k++);}
main()
{inti=4;
fun(i++);printf(“i=%dk=%d\n”,i,k);
}m=4k=4i=5k=52007年9月1、在一個C語言源程序文件中所定義的全局變量,其作用域為:
A)所在文件的全部范圍
B)所在程序的全部范圍
C)所在函數(shù)的全部范圍
D)由具體定義位置和extern說明來決定范圍2007年9月1、有以下程序
#include<stdio.h>
int
a=1;
int
f(int
c)
{static
int
a=2;
c=c+1;
return
(a++)+c;}
main()
{
int
i,k=0;
for(i=0;i<2;i++){int
a=3;k+=f(a);}
k+=a;
printf(“%d\n”,k);
}程序運行結果是
A)14
B)15
C)16
D)172008年4月1、在C語言中,只有在使用時才占用內(nèi)存單元的變量,其存儲類型是A)auto
和register
B)extern和registerC)auto和static
D)static和register2008年9月1、有以下程序
#include<stdio.h>
void
fun(int
a,int
b)
{
int
t;
t=a;a=b;b=t;
}
main()
{
int
c[10]={1,2,3,4,5,6,7,8,9,0},i;
for(i=0;i<10;i+=2)
fun(c[i],c[i+1]);
for(i=0;i<10;i++)
printf("%d,",c[i]);
printf("\n");
}程序的運行結果是A)1,2,3,4,5,6,7,8,9,0,
B)2,1,4,3,6,5,8,7,0,9,C)0,9,8,7,6,5,4,3,2,1,
D)0,1,2,3,4,5,6,7,8,9,2008年9月2、有以下程序
#include
<stdio.h>
void
fun(int
a[],
int
n)
{
int
i,t;
for(i=0;i<n/2;i++)
{t=a[i];a[i]=a[n-1-i];
a[n-1-i]=t;
}
}
main()
{
int
k[10]={1,2,3,4,5,6,7,8,9,10},i;
fun(k,5);
for(i=2;i<8;i++)
printf("%d",k[i]);
printf("\n");
}程序的運行結果是A)345678
B)876543
C)1098765
D)3216782008年9月3、有以下程序
#include
<stdio.h>
#define
N
4
void
fun(int
a[][N],int
b[])
{
int
i;
for(i=0;i<N;i++)
b[i]=a[i][i];
}
main()
{
int
x[][N]={{1,2,3},{4},{5,6,7,8},{9,10}},y[N],i;
fun(x,y);
for(i=0;i<N;i++)
printf("%d,"
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年貴州電子科技職業(yè)學院單招職業(yè)適應性測試題庫帶答案
- 立體幾何最值問題教學設計-2024-2025學年高二上學期數(shù)學人教A版(2019)選擇性必修第一冊
- 機器學習原理與應用電子教案 2.3Matplotlib繪圖
- 第二章綜合與實踐進位制的認識與探究教學設計 2024-2025學年人教版數(shù)學七年級上冊
- 2025年合肥濱湖職業(yè)技術學院單招職業(yè)技能測試題庫1套
- 全國滇人版初中信息技術八年級上冊第一單元第3課《網(wǎng)絡信息交流》教學設計
- 2025年洗染服務項目建議書
- 《8 尋找“食人花”》教學設計-2023-2024學年華中師大版信息技術三年級上冊
- 2024中國南水北調集團水網(wǎng)智慧科技有限公司秋季招聘12人筆試參考題庫附帶答案詳解
- 遼寧省部分高中2024-2025學年高一上學期12月月考地理試題(解析版)
- 2025年蘇州工業(yè)園區(qū)服務外包職業(yè)學院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 小學生拗九節(jié)課件
- 人教版PEP小學五年級英語下冊全冊教案(含計劃)
- 2023湖南文藝出版社五年級音樂下冊全冊教案
- 中職數(shù)學單招一輪總復習《集合》復習課件
- 公司員工離職申請表
- 閩教版(2020版)六年級下冊信息技術整冊教案
- 電芯品質協(xié)議版本(標準版)
- 食管癌化療臨床路徑(最全版)
- 食品銷售經(jīng)營者食品安全管理制度(零售)
- 法大民商考博真題匯總
評論
0/150
提交評論