版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第8章函數(shù)制作人:王敬華第8章:函數(shù)
學(xué)習(xí)的意義
語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C模塊化程序設(shè)計(jì)方法:人們?cè)谇蠼饽硞€(gè)復(fù)雜問(wèn)題時(shí),通常采用逐步分解、分而治之的方法,也就是將一個(gè)大問(wèn)題分解成若干個(gè)比較容易求解的小問(wèn)題,然后分別求解。程序員在設(shè)計(jì)一個(gè)復(fù)雜的應(yīng)用程序時(shí),往往也是把整個(gè)程序劃分成若干個(gè)功能較為單一的程序模塊,然后分別予以實(shí)現(xiàn),最后再把所有的程序模塊象達(dá)積木一樣裝配起來(lái),這種在程序設(shè)計(jì)中分而治之的策略,被稱為模塊化程序設(shè)計(jì)方法。子模塊1子模塊2子模塊n學(xué)習(xí)的意義
功能模塊1功能模塊2功能模塊n……………………軟件項(xiàng)目C語(yǔ)言程序C語(yǔ)言函數(shù)達(dá)積木語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C學(xué)習(xí)的意義
使用函數(shù),不僅可以實(shí)現(xiàn)程序的模塊化,程序設(shè)計(jì)得簡(jiǎn)單和直觀,提高了程序的易讀性和可維護(hù)性。編寫(xiě)自定義函數(shù)庫(kù)。把一些常用的或某些特定功能的程序制作成自己的函數(shù)庫(kù),以供隨時(shí)調(diào)用,這樣可以大大減輕日后編寫(xiě)代碼的工作量。通過(guò)對(duì)函數(shù)的學(xué)習(xí),掌握模塊化程序設(shè)計(jì)的理念,為將來(lái)進(jìn)行團(tuán)隊(duì)合作,協(xié)同完成大型應(yīng)用軟件奠定一定的基礎(chǔ)。
學(xué)習(xí)目標(biāo)
正確理解函數(shù)在C語(yǔ)言程序設(shè)計(jì)中的作用和地位;理解函數(shù)、形參、實(shí)參、作用域、生存期的概念;掌握各種函數(shù)的定義、原型聲明和調(diào)用的方法;理解全局變量、局部變量、靜態(tài)變量、靜態(tài)函數(shù)的作用域和生存期;掌握遞歸函數(shù)的編寫(xiě)規(guī)則;掌握利用工程管理程序的方法;
語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C學(xué)習(xí)內(nèi)容
函數(shù)概述函數(shù)的定義與調(diào)用無(wú)參數(shù)無(wú)返回值的函數(shù)無(wú)參數(shù)有返回值的函數(shù)帶參數(shù)無(wú)返回值的函數(shù)帶參數(shù)有返回值的函數(shù)函數(shù)參數(shù)傳遞的傳遞方式變量的作用域和生存期變量的存儲(chǔ)類型函數(shù)的嵌套和遞歸調(diào)用函數(shù)的作用域函數(shù)應(yīng)用綜合舉例本章小結(jié)語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C8.1函數(shù)概述
1、函數(shù)的概念函數(shù)其實(shí)就是一段可以重復(fù)調(diào)用的、功能相對(duì)獨(dú)立完整的程序段。
C是函數(shù)式語(yǔ)言
必須有且只能有一個(gè)名為main的主函數(shù)
C程序的執(zhí)行總是從main函數(shù)開(kāi)始,在main中結(jié)束
函數(shù)不能嵌套定義,可以嵌套調(diào)用2、函數(shù)的分類從用戶角度標(biāo)準(zhǔn)函數(shù)(庫(kù)函數(shù)):由系統(tǒng)提供用戶自定義函數(shù)從函數(shù)形式無(wú)參數(shù)無(wú)返回值無(wú)參數(shù)有返回值
有參數(shù)無(wú)返回值
有參數(shù)有返回值使用庫(kù)函數(shù)應(yīng)注意:
1、函數(shù)功能
2、函數(shù)參數(shù)的數(shù)目和順序,及各參數(shù)意義和類型
3、函數(shù)返回值意義和類型
4、需要使用的包含文件語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C8.2函數(shù)的定義和調(diào)用
1、無(wú)參數(shù)無(wú)返回值的函數(shù)定義格式
void函數(shù)名(void){
變量聲明部分執(zhí)行部分}函數(shù)體空類型,表明函數(shù)無(wú)返回值,不可??!表明無(wú)參數(shù),可缺??!必須為合法的標(biāo)識(shí)符函數(shù)用途
此類函數(shù)用于完成某項(xiàng)固定的處理任務(wù),執(zhí)行完成后不向調(diào)用者返回函數(shù)值。它類似于其它語(yǔ)言的過(guò)程。函數(shù)的原型聲明
void函數(shù)名(void);或void函數(shù)名();
C語(yǔ)言規(guī)定,對(duì)函數(shù)調(diào)用之前必須對(duì)其原型加以聲明,否則會(huì)出現(xiàn)編譯錯(cuò)!語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C1、無(wú)參數(shù)無(wú)返回值的函數(shù)函數(shù)的調(diào)用
函數(shù)名();注意:不能將這種函數(shù)調(diào)用賦值給任何變量,因?yàn)樗鼪](méi)有返回值。調(diào)用時(shí),()中間不能有void。實(shí)例
#include<stdio.h>#include<math.h>voidshowerror();
//聲明showerror函數(shù)的原型voidmain(){
inta;
scanf("%d",&a);while(a<0){
showerror();
scanf("%d",&a);}
printf("sqrt(a)=%.2f\n",sqrt(a));}voidshowerror()
//函數(shù)的定義,無(wú)參數(shù)無(wú)返回值{
printf("inputerror!\n");//函數(shù)體,沒(méi)有聲明變量}調(diào)用showerror函數(shù)
返回
注意:對(duì)函數(shù)調(diào)用之前,必須要先聲明或先定義,否則編譯錯(cuò)!語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C編寫(xiě)C程序的一般格式
文件包括(如include<stdio.h>等,用于標(biāo)準(zhǔn)庫(kù)庫(kù)函數(shù)原型聲明)常量定義(根據(jù)需要而定,如#definePI3.1415等)變量定義(根據(jù)需要而定)用戶自定義函數(shù)原型聲明main函數(shù)用戶自定義函數(shù)函數(shù)的返回
形式
①
rerurn(表達(dá)式);//有返回值
②
rerutn
表達(dá)式;//有返回值
③
return;//無(wú)返回值
使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,如果有返回值,同時(shí)把返值帶給調(diào)用函數(shù)。
功能
說(shuō)明函數(shù)中可以有多個(gè)return語(yǔ)句。在無(wú)返回值的函數(shù)中,return語(yǔ)句的形式只能是第③種形式。
例如:voidshowyes(){charkey;
key=getch();if(toupper(key)!='Y')
return;
printf("YES!");}函數(shù)showyes的功能是:
如果輸入的字符不是'Y'或'y',則什么都不輸出,直接返回,否則,輸出"YES!"標(biāo)準(zhǔn)庫(kù)函數(shù),其功能是將小寫(xiě)字符轉(zhuǎn)換成大寫(xiě)字符
語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C2、無(wú)參數(shù)有返回值的函數(shù)定義格式
返回值類型符
函數(shù)名(void){
變量聲明部分執(zhí)行部分}函數(shù)體可以為除數(shù)組類型外的任何類型,缺省時(shí),默認(rèn)為int型表明無(wú)參數(shù),可缺?。”仨殲楹戏ǖ臉?biāo)識(shí)符函數(shù)用途
此類函數(shù)用于完成某項(xiàng)固定的處理任務(wù),執(zhí)行完成后向調(diào)用者返回函數(shù)值。函數(shù)的原型聲明
返回值類型符
函數(shù)名(void);
或
返回值類型符
函數(shù)名();語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C2、無(wú)參數(shù)有返回值的函數(shù)函數(shù)的調(diào)用
函數(shù)名(void);或變量=函數(shù)名();實(shí)例#include<stdio.h>#include<conio.h>#include<ctype.h>intsum();voidmain(){
inttot;tot=sum();if(tot==-1)
printf("\nnotselect!\n");else
printf("\ntheresultis:%d\n",tot);}intsum(){
inti,tot=0;charkey;key=getche();if(key!='0'&&key!='1')
return(-1);
for(i=(key=='0')?2:1;i<=100;i+=2)tot+=i;
return(tot);}聲明sum函數(shù)的原型
調(diào)用sum函數(shù)函數(shù)的定義,無(wú)參數(shù)有返回值
變量聲明部分函數(shù)sum的功能是:
輸入‘0’:計(jì)算1~100之間所有偶數(shù)之和
輸入‘1’:計(jì)算1~100之間所有奇數(shù)之和語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C2、無(wú)參數(shù)有返回值的函數(shù)函數(shù)的返回表達(dá)式的值即是函數(shù)的返回值;函數(shù)體中一般都包含return(表達(dá)式)語(yǔ)句,如果沒(méi)有,函數(shù)也會(huì)返回一個(gè)值。這個(gè)值是不可預(yù)知的,將會(huì)使程序可能犯有邏輯錯(cuò);一般情況下,表達(dá)式值的類型應(yīng)與函數(shù)返回值類型一致;當(dāng)return(表達(dá)式)語(yǔ)句中的表達(dá)式的類型與函數(shù)的返回值類型不一致時(shí),編譯器將對(duì)表達(dá)式進(jìn)行強(qiáng)制類型轉(zhuǎn)換,將表達(dá)式的值強(qiáng)制轉(zhuǎn)換成函數(shù)返回值類型,然后返回給調(diào)用者。
格式
rerurn(表達(dá)式);或
rerutn
表達(dá)式;
說(shuō)明#include<stdio.h>intsum();voidmain(){
intx;x=sum();
printf(“x=%d\n",x);}intsum(){
inti,tot=0;for(i=1;i<=100;i++)tot+=i;}因sum函數(shù)無(wú)return語(yǔ)句,x的值將是無(wú)法預(yù)知的!應(yīng)加上returntot;
語(yǔ)句int
func(){floatf=5;f=f/2;return(f);}函數(shù)將返回2,而不是2.5
注意:如果不將函數(shù)調(diào)用賦值給任何變量,它的返回值將被丟棄!
語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C3、有參數(shù)無(wú)返回值的函數(shù)定義格式
void函數(shù)名(類型符1形參名1,類型符2形參名2,…,類型符n形參名n
){
變量聲明部分執(zhí)行部分}函數(shù)體函數(shù)用途
此類型的函數(shù)主要是根據(jù)形參的值來(lái)進(jìn)行某種事務(wù)的處理。靈活性上要比無(wú)形參的函數(shù)強(qiáng),它更能體現(xiàn)調(diào)用函數(shù)與被調(diào)函數(shù)之間的數(shù)據(jù)聯(lián)系。
函數(shù)的原型聲明
void函數(shù)名(類型符1形參名1,類型符2形參名2,…,類型符n形參名n);或
void函數(shù)名(類型符1,類型符2,…,類型符n);形參列表至少要有一項(xiàng),形參之間要用逗號(hào)“,”分開(kāi)
指明形參類型
不允許對(duì)形參賦初值
語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C3、有參數(shù)無(wú)返回值的函數(shù)函數(shù)調(diào)用
函數(shù)名(實(shí)參1,實(shí)參2,……,實(shí)參n);
實(shí)參可以是常量、變量、表達(dá)式、函數(shù)等
注意事項(xiàng):
(1)實(shí)參列表中的實(shí)參必須與函數(shù)定義時(shí)的形參數(shù)量相同、類型相符。
(2)賦值對(duì)應(yīng)關(guān)系:
實(shí)參1->形參1
實(shí)參2->形參2……
實(shí)參n->形參n(3)實(shí)參表求值順序(即實(shí)參賦值給形參的順序)因系統(tǒng)而定。TC、BC、VC均是自右向左,也就是說(shuō)最右邊的實(shí)參最先賦值給最右邊的形參,最左邊的實(shí)參最后賦值給最左邊的形參。但VC與TC、BC在具體賦值時(shí)稍有不同,注意它們之間的區(qū)別。語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C3、有參數(shù)無(wú)返回值的函數(shù)#include<stdio.h>voidcompare(inta,intb);voidmain(){
inti=2;compare(i,i++);
printf("i=%d\n",i);}voidcompare(inta,intb){
printf("a=%db=%d\n",a,b);if(a>b)
printf("a>b\n");elseif(a==b)
printf("a=b\n");else
printf("a<b\n");}i為實(shí)參
a、b為形參
原型聲明
a=3b=2a>bi=3運(yùn)行結(jié)果(在TC或BC下)a=2b=2a=bi=3運(yùn)行結(jié)果(在VC下)①i2i++2ab實(shí)參形參2②i+13③3i2i++2ab實(shí)參形參①2②2③i+13語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C4、有參數(shù)有返回值的函數(shù)定義格式
返回值類型符
函數(shù)名(類型符1形參名1,……,類型符n形參名n
){
變量聲明部分執(zhí)行部分}函數(shù)體函數(shù)用途
此類型的函數(shù)主要是根據(jù)形參的值來(lái)進(jìn)行某種事務(wù)的處理,同時(shí)可將處理后的結(jié)果值返回給調(diào)用函數(shù)
。它最能體現(xiàn)調(diào)用函數(shù)與被調(diào)函數(shù)之間的數(shù)據(jù)聯(lián)系。
函數(shù)的原型聲明
返回值類型符
函數(shù)名(類型符1形參名1,……,類型符n形參名n);或
返回值類型符
函數(shù)名(類型符1,類型符2,……,類型符n);形參列表語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C4、有參數(shù)有返回值的函數(shù)函數(shù)調(diào)用
函數(shù)名(實(shí)參1,實(shí)參2,……,實(shí)參n);
或變量名=函數(shù)名(實(shí)參1,實(shí)參2,……,實(shí)參n);#include<stdio.h>intmax(inta,intb);//函數(shù)的原型聲明voidmain(){
inta,b,c;
scanf("%d%d",&a,&b);
c=max(a,b);
//函數(shù)調(diào)用(a、b為實(shí)參)
printf("thebiggestnumberis:%d\n",c);}intmax(inta,intb)//函數(shù)定義(a、b為形參){return(a>b?a:b);}運(yùn)行結(jié)果:59↙thebiggestnumberis9語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C5、函數(shù)調(diào)用和函數(shù)說(shuō)明小結(jié)函數(shù)調(diào)用
函數(shù)語(yǔ)句:例:printstar();
printf(“Hello,World!\n”);
函數(shù)表達(dá)式:
例:m=max(a,b)*2;
函數(shù)參數(shù):
例:
printf(“%d”,max(a,b));m=max(a,max(b,c));語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C函數(shù)說(shuō)明
對(duì)被調(diào)用函數(shù)要求:必須是已存在的函數(shù)庫(kù)函數(shù):#include<*.h>用戶自定義函數(shù):函數(shù)類型說(shuō)明函數(shù)說(shuō)明一般形式:函數(shù)類型函數(shù)名(形參類型[形參名],…..);
或函數(shù)類型函數(shù)名();作用:告訴編譯系統(tǒng)函數(shù)類型、參數(shù)個(gè)數(shù)及類型,以便檢驗(yàn)函數(shù)定義與函數(shù)說(shuō)明不同函數(shù)說(shuō)明位置:程序的數(shù)據(jù)說(shuō)明部分(函數(shù)內(nèi)或外)下列情況下,可不作函數(shù)說(shuō)明若函數(shù)返值是char或int型,系統(tǒng)自動(dòng)按int型處理
被調(diào)用函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前有些系統(tǒng)(如BC、VC)要求函數(shù)說(shuō)明指出函數(shù)返值類型和形參類型,并且對(duì)void和int
型函數(shù)也要進(jìn)行函數(shù)說(shuō)明語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C例:函數(shù)說(shuō)明舉例floatadd(floatx,floaty){floatz;z=x+y;return(z);}voidmain(){floata,b,c;
scanf("%f,%f",&a,&b);c=add(a,b);
printf("sumis%f",c);}被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之前,不必函數(shù)說(shuō)明voidmain(){
floatadd(float,float);//函數(shù)原型聲明
floata,b,c;
scanf("%f,%f",&a,&b);c=add(a,b);
printf("sumis%f",c);}floatadd(floatx,floaty){floatz;z=x+y;return(z);}voidmain(){floata,b;
intc;
scanf("%f,%f",&a,&b);c=max(a,b);
printf("Maxis%d\n",c);}max(floatx,floaty){floatz;z=x>y?x:y;return(z);}int型函數(shù)可不作函數(shù)說(shuō)明(BC、VC下不行)語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C8.3函數(shù)參數(shù)的傳遞方式
1、值傳遞方式根據(jù)實(shí)參傳遞給形參值的不同,通常有值傳遞方式和地址傳遞方式兩種。
方式:函數(shù)調(diào)用時(shí),為形參分配單元,并將實(shí)參的值復(fù)制到形參中;調(diào)用結(jié)束,形參單元被釋放,實(shí)參單元仍保留并維持原值。特點(diǎn):
①形參與實(shí)參占用不同的內(nèi)存單元
②單向傳遞語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C7x11y②
調(diào)用例:交換兩個(gè)數(shù)(值傳遞方式)#include<stdio.h>voidswap(inta,intb);voidmain(){
intx=7,y=11;
printf("beforeswapped:");
printf("x=%d,y=%d\n",x,y);swap(x,y);
printf("afterswapped:");
printf("x=%d,y=%d\n",x,y);}voidswap(inta,intb){
inttemp;temp=a;a=b;b=temp;}運(yùn)行結(jié)果:beforeswapped:x=7,y=11afterswapped:x=7,y=117x11y①調(diào)用前7a11b③
swap7x11y7a11btemp71177x11y④
調(diào)用結(jié)束Why?語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C2、地址傳遞方式方式:函數(shù)調(diào)用時(shí),將數(shù)據(jù)的存儲(chǔ)地址作為參數(shù)傳遞給形參特點(diǎn):
①形參與實(shí)參占用同樣的存儲(chǔ)單元
②雙向傳遞
③實(shí)參和形參必須是地址常量或變量用數(shù)組名作為函數(shù)參數(shù)時(shí)還應(yīng)注意以下幾點(diǎn):
形參數(shù)組和實(shí)參數(shù)組的類型必須一致,否則將引起錯(cuò)誤。形參數(shù)組和實(shí)參數(shù)組的長(zhǎng)度可以不相同,因?yàn)樵谡{(diào)用時(shí),只傳送首地址而不檢查形參數(shù)組的長(zhǎng)度。多維數(shù)組也可以作為函數(shù)的參數(shù)。在函數(shù)定義時(shí)對(duì)形參數(shù)組可以指定每一維的長(zhǎng)度,也可省去第一維的長(zhǎng)度。除了用數(shù)組名作為函數(shù)參數(shù)來(lái)實(shí)現(xiàn)參數(shù)的地址傳遞以外,其實(shí)還有一種應(yīng)用更廣的地址傳遞方法,那就是用指針變量來(lái)作為函數(shù)的形參,其具體使用方法將在第9章作詳細(xì)討論。語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C例:將任意兩個(gè)字符串連接成一個(gè)字符串
(數(shù)組名作為函數(shù)參數(shù)實(shí)現(xiàn)地址傳遞方式)#include<stdio.h>voidmergestr(chars1[],chars2[],chars3[]);
voidmain(){charstr1[]={"Hello"};charstr2[]={"china!"};charstr3[40];
mergestr(str1,str2,str3);
printf("%s\n",str3);}voidmergestr(chars1[],chars2[],chars3[]){
inti,j;for(i=0;s1[i]!='\0';i++)//將s1復(fù)制到s3中
s3[i]=s1[i];for(j=0;s2[j]!='\0';j++)//將s2復(fù)制到s3的后邊
s3[i+j]=s2[j];s3[i+j]='\0';//置字符串結(jié)束標(biāo)志}運(yùn)行結(jié)果:Hellochina!語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)Cstr1str2str3'H''e''l''l''o''''\0''c''h''i''n''a''!''\0's1s2s3調(diào)用前調(diào)用連接'H''e''l''l''o'''for(i=0;s1[i]!='\0';i++)s3[i]=s1[i];'c''h''i''n''a''!'for(j=0;s2[j]!='\0';j++)s3[i+j]=s2[j];'\0'補(bǔ)\0s3[i+j]='\0';調(diào)用結(jié)束語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C8.4變量的作用域和生存期
1、作用域和生存期的基本概念變量的作用域即變量的作用范圍(或有效范圍)。表現(xiàn)為變量有的可以在整個(gè)程序或其它程序中進(jìn)行引用,有的則只能在局部范圍內(nèi)引用。按其作用域范圍可分為兩種:即局部變量和全局變量
變量的生存期變量從被生成到被撤消的這段時(shí)間。實(shí)際上就是變量占用內(nèi)存的時(shí)間。
按其生存期可分為兩種:即動(dòng)態(tài)變量和靜態(tài)變量
變量只能在其生存期內(nèi)被引用,變量的作用域直接影響變量的生存期。作用域和生存期是從空間和時(shí)間的角度來(lái)體現(xiàn)變量的特性。
語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C2、局部變量作用域和生存期定義在函數(shù)內(nèi)作定義說(shuō)明的變量,也稱為內(nèi)部變量
。
作用域僅限于函數(shù)內(nèi),離開(kāi)函數(shù)后不可再引用。
生存期從函數(shù)被調(diào)用的時(shí)刻到函數(shù)返回調(diào)用處的時(shí)刻(靜態(tài)局部變量除外)。intf1(intx,inty){
intz;z=x>y?x:y;return(z);}voidf2(){
printf("%d\n",z);}局部變量
變量x、y、z的作用域引用錯(cuò)誤!語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C
說(shuō)明
(1)主函數(shù)main()中定義的變量也是局部變量,它只能在主函數(shù)中使用,其它函數(shù)不能使用。同時(shí),主函數(shù)中也不能使用其它函數(shù)中定義的局部變量。
intf3(intx);voidmain(){
int
a=2,b;b=a+y;
printf("%d\n",b);}intf3(int
x){
int
y;y=a+5;return(y);}局部變量
變量a、b的作用域變量x、y的作用域局部變量
錯(cuò)誤!錯(cuò)誤!語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C
說(shuō)明
(2)形參變量屬于被調(diào)用函數(shù)的局部變量;實(shí)參變量則屬于全局變量或調(diào)用函數(shù)的局部變量。
(3)允許在不同的函數(shù)中使用相同的變量名,它們代表不同的對(duì)象,分配不同的單元,互不干擾,也不會(huì)發(fā)生混淆。#include<stdio.h>voidsubf();voidmain(){
inta,b;
a=3,b=4;
printf("main:a=%d,b=%d\n",a,b);
subf();
printf("main:a=%d,b=%d\n",a,b);}voidsubf(){
inta,b;a=6,b=7;
printf("subf:a=%d,b=%d\n",a,b);}運(yùn)行結(jié)果:main:a=3,b=4subf:a=6,b=7main:a=3,b=4變量名相同
語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C
說(shuō)明
(4)在復(fù)合語(yǔ)句中定義的變量也是局部變量,其作用域只在復(fù)合語(yǔ)句范圍內(nèi)。其生存期是從復(fù)合語(yǔ)句被執(zhí)行的時(shí)刻到復(fù)合語(yǔ)句執(zhí)行完畢的時(shí)刻。
#include<stdio.h>voidmain(){
inta=2,b=4;
{
intk,b;k=a+5;b=a*5;
printf("k=%d\n",k);
printf("b=%d\n",b);}
printf("b=%d\n",b);a=k+2;}main中的局部變量
復(fù)合語(yǔ)句中的局部變量
mian中變量a、b的作用域
復(fù)合語(yǔ)句中變量k、b的作用域輸出k=7
輸出b=10
輸出b=4
錯(cuò)誤!語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C3、全局變量作用域和生存期定義在函數(shù)外部作定義說(shuō)明的變量,也稱為外部變量
。它不屬于哪一個(gè)函數(shù),而屬于一個(gè)源程序文件。
作用域從定義變量的位置開(kāi)始到本源文件結(jié)束,及有extern說(shuō)明的其它源文件。
生存期與程序相同。即從程序開(kāi)始執(zhí)行到程序終止的這段時(shí)間內(nèi),全局變量都有效。
#include<stdio.h>#include<math.h>intsign();//計(jì)算數(shù)n的平方根floatsqr(){if(n>0)return(sqrt(n));elsereturn(-1);}floatn=0;voidmain(){
ints;floatt;
scanf("%f",&n);s=sign();//取符號(hào)
t=sqr();//取平方根
printf("s=%dt=%f",s,t);}//取數(shù)n的符號(hào)intsign(){
intr=0;if(n>0)r=1;if(n<0)r=-1;return(r);}定義全局變量,并賦初值局部變量全局變量n的作用域
局部變量s、t的作用域局部變量局部變量r的作用域錯(cuò)誤!語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C
說(shuō)明
(1)應(yīng)盡量少使用全局變量。
全局變量在程序全部執(zhí)行過(guò)程中始終占用存儲(chǔ)單元降低了函數(shù)的獨(dú)立性、通用性、可靠性及可移植性降低程序清晰性,容易出錯(cuò)
(2)若外部變量與局部變量同名,則外部變量被屏蔽。要引用全局變量,則必須在變量名前家上兩個(gè)冒號(hào)“::”
#include<stdio.h>inta=10;
//全局變量voidmain(){
inta=100;
//局部變量(與全局變量同名)
printf("locala=%d\n",a);
printf("globala=%d\n",::a);}運(yùn)行結(jié)果:locala=100globala=10
注意:局部變量與全局變量同名極易導(dǎo)致程序員犯邏輯錯(cuò)誤。語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C
說(shuō)明
(3)全局變量定義必須在所有的函數(shù)之外,且只能定義一次,并可賦初始值。全局變量定義的一般形式為:
[extern]類型說(shuō)明符全局變量名1[=初始值1],……,全局變量名n[=初始值n];可缺省!charch='Y';voidmain(){……}charch;voidfunc(){……}定義全局變量ch錯(cuò)誤!ch只能定義一次例:inta=2,b=4;extern
inta=2,b=4;語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C
說(shuō)明
(4)對(duì)全局變量進(jìn)行說(shuō)明,可擴(kuò)展全局變量的作用域。全局變量說(shuō)明的一般形式為:extern
類型說(shuō)明符全局變量名1,…,全局變量名n;不可缺省!不可賦初值!voidgx(),gy();voidmain(){
extern
intx,y;
printf("1:x=%d\ty=%d\n",x,y);y=246;
gx();gy();}extern
intx,y;voidgx(){x=135;
printf("2:x=%d\ty=%d\n",x,y);}intx=0,y=0;voidgy(){
printf("3:x=%d\ty=%d\n",x,y);}全局變量定義未說(shuō)明前的作用域全局變量說(shuō)明說(shuō)明后的作用域全局變量說(shuō)明說(shuō)明后的作用域運(yùn)行結(jié)果:
1:x=0y=02:x=135y=2463:x=135y=246語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C
說(shuō)明
(5)全局變量定義與全局變量的說(shuō)明的區(qū)分
externinta;
voidfunc1(){……//引用變量a}externinta=2;
voidfunc2(){……//引用變量a}誰(shuí)是定義?誰(shuí)是說(shuō)明?全局變量定義(因?yàn)橘x了初值)全局變量說(shuō)明
注意:兩者中有且只能有一個(gè)對(duì)變量a賦初始值,不能都對(duì)變量a賦初始值或都不賦值,否則編譯錯(cuò)!
語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C8.5變量的存儲(chǔ)類型
概述變量是對(duì)程序中數(shù)據(jù)的存儲(chǔ)空間的抽象變量的屬性
①數(shù)據(jù)類型:變量所持有的數(shù)據(jù)的性質(zhì)(操作屬性)。規(guī)定了它們的取值范圍和可參與的運(yùn)算。
②存儲(chǔ)類型:
規(guī)定了變量占用內(nèi)存空間的方式,也稱為存儲(chǔ)方式。分為靜態(tài)存儲(chǔ)和動(dòng)態(tài)存儲(chǔ)兩種。
靜態(tài)存儲(chǔ)類型的變量是指在程序運(yùn)行期間由系統(tǒng)分配固定的內(nèi)存單元,并一直保持不變,直至整個(gè)程序結(jié)束,內(nèi)存空間才被釋放。前面所介紹的全局變量即屬于此類存儲(chǔ)方式。
動(dòng)態(tài)存儲(chǔ)類型的變量是在程序運(yùn)行期間根據(jù)需要進(jìn)行動(dòng)態(tài)分配內(nèi)存單元,使用完畢立即釋放。典型的例子是函數(shù)的形式參數(shù)即屬于此類存儲(chǔ)方式。語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C一個(gè)C語(yǔ)言程序在執(zhí)行時(shí)內(nèi)存被分為兩大塊:一塊是系統(tǒng)區(qū),用于存放操作系統(tǒng)等內(nèi)容,另一塊是用戶區(qū),用來(lái)存放被執(zhí)行的用戶程序及數(shù)據(jù)
語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C程序區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)操作系統(tǒng)等系統(tǒng)區(qū)用戶區(qū)用來(lái)存放C語(yǔ)言程序運(yùn)行代碼。用來(lái)存放變量,在這個(gè)區(qū)域中存儲(chǔ)的變量被稱作靜態(tài)變量。在程序開(kāi)始執(zhí)行時(shí)全局變量全部放在靜態(tài)存儲(chǔ)區(qū)中,程序執(zhí)行完畢就釋放。在程序執(zhí)行過(guò)程中它們占據(jù)固定的存儲(chǔ)單元,而不是動(dòng)態(tài)地進(jìn)行分配和釋放。用來(lái)存放變量以及進(jìn)行函數(shù)調(diào)用時(shí)的現(xiàn)場(chǎng)信息和函數(shù)返回地址等,在這個(gè)區(qū)域存儲(chǔ)的變量稱之為動(dòng)態(tài)變量,如形參變量、函數(shù)體內(nèi)部定義的動(dòng)態(tài)局部變量。對(duì)于存放于動(dòng)態(tài)存儲(chǔ)區(qū)的變量,是在函數(shù)調(diào)用開(kāi)始時(shí)才分配動(dòng)態(tài)存儲(chǔ)空間,函數(shù)運(yùn)行結(jié)束時(shí)釋放這些空間。
在C語(yǔ)言中,對(duì)變量的存儲(chǔ)類型說(shuō)明有以下四種:auto---------自動(dòng)型register-----寄存器型static-------靜態(tài)型extern-------外部型存儲(chǔ)類型說(shuō)明符數(shù)據(jù)類型說(shuō)明符變量名1,變量名2,…,變量名n;變量定義的完整形式應(yīng)為:
例如:
autocharc1,c2;//c1,c2為自動(dòng)字符變量
registeri;//i為寄存器型變量
staticinta,b;//a,b為靜態(tài)整型變量
externintx,y;//x,y為外部整型變量語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C1、自動(dòng)變量(auto型變量)[auto]數(shù)據(jù)類型說(shuō)明符變量名1,變量名2,…,變量名n;定義格式說(shuō)明存儲(chǔ)類型說(shuō)明符auto可以省略。自動(dòng)變量只能在函數(shù)內(nèi)或復(fù)合語(yǔ)句中定義,它屬于局部變量。voidfunc(){
inti,j,k;
……}等價(jià)于autointi,j,k;autointk;
voidfunc(){……}錯(cuò)誤!自動(dòng)變量不可定義在函數(shù)外
注意:在函數(shù)外部定義的沒(méi)有帶存儲(chǔ)類型說(shuō)明符的全局變量是外部變量,屬于靜態(tài)存儲(chǔ)類型。
如:intk;
//k為外部變量,屬靜態(tài)存儲(chǔ)類型
voidfunc(){……}語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C2、外部變量(extern型變量)
外部變量和全局變量是對(duì)同一類變量的兩種不同角度的提法。全局變是是從它的作用域提出的,外部變量從它的存儲(chǔ)方式提出的,表示了它的生存期。它屬于靜態(tài)存儲(chǔ)類型。例:引用其它文件中的外部變量原文件prg1.cppinta,b;
//外部變量定義intmax();//外部函數(shù)聲明voidmain(){
intc;
a=4,b=5;c=max();
printf("max=%d\n",c);}原文件prg2.cppexterninta,b;
//外部變量定義intmax(){return(a>b?a:b);}編譯、鏈接、運(yùn)行運(yùn)行結(jié)果:
max=5語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C3、靜態(tài)變量(static型變量)靜態(tài)變量與靜態(tài)存儲(chǔ)類型靜態(tài)變量的類型說(shuō)明符是static。靜態(tài)變量屬于靜態(tài)存儲(chǔ)類型。靜態(tài)存儲(chǔ)類型的變量不一定就是靜態(tài)變量。例如外部變量雖屬于靜態(tài)存儲(chǔ)類型但不一定是靜態(tài)變量,必須由static加以定義后才能成為靜態(tài)外部變量,或稱靜態(tài)全局變量。
自動(dòng)變量可以用static定義它為靜態(tài)自動(dòng)變量,或稱靜態(tài)局部變量,從而成為靜態(tài)存儲(chǔ)方式。靜態(tài)局部變量在局部變量的說(shuō)明前加上static就構(gòu)成靜態(tài)局部變量
例如:
static
inta,b;staticfloatarray[5]={1,2,3,4,5};語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C靜態(tài)局部變量與自動(dòng)變量之比較靜態(tài)局部變量與自動(dòng)變量均屬于局部變量
靜態(tài)局部變量生存期長(zhǎng),為整個(gè)源程序。自動(dòng)變量生存期短。靜態(tài)局部變量的生存期雖然為整個(gè)源程序,但是其作用域仍與自動(dòng)變量相同voidfunc();voidmain()
{
inta;a=s+5;……}voidfunc(){staticints;……}定義靜態(tài)局部變量s錯(cuò)誤!s的作用域語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C靜態(tài)局部變量與自動(dòng)變量之比較靜態(tài)局部變量若在定義時(shí)未賦初值,則系統(tǒng)自動(dòng)賦初值0
靜態(tài)局部變量賦初值只一次,而自動(dòng)變量賦初值可能多次#include<stdio.h>voidmain(){
inti;voidfunc();//函數(shù)說(shuō)明
for(i=1;i<=5;i++)
func();//函數(shù)調(diào)用}voidfunc()//函數(shù)定義{
autointj=0;++j;
printf("%d",j);}#include<stdio.h>voidmain(){
inti;voidfunc();//函數(shù)說(shuō)明
for(i=1;i<=5;i++)
func();//函數(shù)調(diào)用}voidfunc()//函數(shù)定義{
staticintj=0;++j;
printf("%d",j);}自動(dòng)變量靜態(tài)變量運(yùn)行結(jié)果:11111
運(yùn)行結(jié)果:12345
語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C靜態(tài)全局變量全局變量(外部變量)的說(shuō)明之前再冠以static就構(gòu)成了靜態(tài)全局變量。全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域,限制了它的使用范圍。當(dāng)一個(gè)源程序由多個(gè)源文件組成時(shí),非靜態(tài)的全局變量可通過(guò)外部變量說(shuō)明使其在整個(gè)源程序中都有效。而靜態(tài)全局變量只在定義該變量的源文件內(nèi)有效,在同一源程序的其它源文件中不能通過(guò)外部變量說(shuō)明來(lái)使用它。
prg1.cpp
inta,b;staticcharch;
voidmain(){……}
prg2.cpp
externinta,b;externcharch;
int
func(intx,inty){……}
外部(全局)變量定義靜態(tài)全局變量定義錯(cuò)誤!語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C4、寄存器變量(register型變量)這種變量存放在CPU的寄存器中,使用時(shí),不需要訪問(wèn)內(nèi)存,而直接從寄存器中讀寫(xiě),這樣可提高效率。寄存器變量的說(shuō)明符是register,屬于動(dòng)態(tài)存儲(chǔ)類型。
voidmain(){
registeri,s=0;for(i=1;i<=100;i++)s=s+i;
printf("s=%d\n",s);}幾點(diǎn)說(shuō)明:只有局部自動(dòng)變量和形式參數(shù)才可以定義為寄存器變量。
register修飾符是過(guò)時(shí)的修飾。語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C8.6函數(shù)的嵌套與遞歸調(diào)用C規(guī)定:函數(shù)定義不可嵌套,
1、函數(shù)的嵌套調(diào)用但可以嵌套調(diào)用函數(shù)main()調(diào)用函數(shù)a結(jié)束a函數(shù)b函數(shù)調(diào)用函數(shù)b——函數(shù)嵌套調(diào)用的示意圖
語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C過(guò)程的嵌套調(diào)用r主程序srrrs子過(guò)程1rst子過(guò)程2rst子過(guò)程3語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C【例】計(jì)算三個(gè)數(shù)中最大數(shù)與最小數(shù)的差。#include<stdio.h>
intdif(intx,inty,intz);
intmax(intx,inty,intz);
intmin(intx,inty,intz);voidmain(){
inta,b,c,d;
scanf("%d%d%d",&a,&b,&c);d=dif(a,b,c);
printf("Max-Min=%d\n",d);}intdif(intx,inty,intz)
{return(max(x,y,z)–
min(x,y,z));}intmax(intx,inty,intz){
intr;r=x>y?x:y;return(r>z?r:z);}intmin(intx,inty,intz)
{
intr;r=x<y?x:y;return(r<z?r:z);}main()調(diào)用函數(shù)dif輸出結(jié)束dif函數(shù)max函數(shù)調(diào)用函數(shù)max調(diào)用函數(shù)minmin函數(shù)語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C2、函數(shù)遞歸調(diào)用定義:函數(shù)直接或間接的調(diào)用自身叫函數(shù)的遞歸調(diào)用f()調(diào)f調(diào)f2調(diào)f1f1()f2()說(shuō)明int
f(intx){
inty,z;……
z=f(y);…….return(2*z);}int
f1(intx){
inty,z;……
z=f2(y);…….return(2*z);}int
f2(intt){
inta,c;……
c=f1(a);…….return(3+c);}直接遞歸間接遞歸
C編譯系統(tǒng)對(duì)遞歸函數(shù)的自調(diào)用次數(shù)沒(méi)有限制
每調(diào)用函數(shù)一次,在內(nèi)存堆棧區(qū)分配空間,用于存放函數(shù)變量、返回值等信息,所以遞歸次數(shù)過(guò)多,可能引起堆棧溢出語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C【例1】遞歸的執(zhí)行情況分析
遞歸過(guò)程及其實(shí)現(xiàn)遞歸:函數(shù)直接或間接的調(diào)用自身叫遞歸實(shí)現(xiàn):建立遞歸工作棧運(yùn)行結(jié)果:1,2,2,3,3,3,#include<stdio.h>voidprint(intw);voidmain(){print(3);}voidprint(intw)
//遞歸函數(shù){
inti;if(w!=0)//遞歸結(jié)束條件
{
print(w-1);for(i=1;i<=w;++i)
printf("%d",w);
printf("\n");}}語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C遞歸調(diào)用執(zhí)行情況如下:主程序(1)print(w)w=3;3print(2);(1)w=3top(2)輸出:3,3,3w2print(1);(2)w=2(1)w=3top(3)輸出:2,2w1print(0);(3)w=1(2)w=2(1)w=3top(4)輸出:1w0(4)w=0(3)w=1(2)w=2(1)w=3topw(3)輸出:2,2(2)2(1)3top(4)輸出:1(3)1(2)2(1)3top(2)輸出:3,3,3(1)3top返回(3)1(2)2(1)3top(4)0結(jié)束(1)語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C【例2】求n的階乘n!
longfactn(intn){longL=1;
inti;for(i=1;i<=n;i++)L*=i;return(L);}方法一:利用循環(huán)因?yàn)閚!=n*(n-1)*(n-2)*…*2*1,我們完全可以用循環(huán)語(yǔ)句來(lái)編寫(xiě)這個(gè)非遞歸函數(shù)factn:方法二:利用遞歸n!=1當(dāng)n=1時(shí)n*(n-1)!當(dāng)n>1時(shí)longfactn(intn)
{longL;if(n==1)return(1);L=n*fact(n-1);return(L);}語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)Cvoidmain(){…L=factn(4);…}遞歸調(diào)用執(zhí)行情況如下:longfactn(4){longL;…L=4*factn(3);return(L);}longfactn(3){longL;…L=3*factn(2);return(L);}longfactn(2){longL;…L=2*factn(1);return(L);}longfactn(1){longL;…return(1);}返回1返回2返回6返回24語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C【例3】TowerofHanoi問(wèn)題問(wèn)題描述:有A,B,C三個(gè)塔座,A上套有n個(gè)直徑不同的圓盤(pán),按直徑從小到大疊放,形如寶塔,編號(hào)1,2,3……n。要求將n個(gè)圓盤(pán)從A移到C,疊放順序不變,移動(dòng)過(guò)程中遵循下列原則:每次只能移一個(gè)圓盤(pán)圓盤(pán)可在三個(gè)塔座上任意移動(dòng)任何時(shí)刻,每個(gè)塔座上不能將大盤(pán)壓到小盤(pán)上解決方法:n=1時(shí),直接把圓盤(pán)從A移到Cn>1時(shí),先把上面n-1個(gè)圓盤(pán)從A移到B,然后將n號(hào)盤(pán)從A移到C,再將n-1個(gè)盤(pán)從B移到C。即把求解n個(gè)圓盤(pán)的Hanoi問(wèn)題轉(zhuǎn)化為求解n-1個(gè)圓盤(pán)的Hanoi問(wèn)題,依次類推,直至轉(zhuǎn)化成只有一個(gè)圓盤(pán)的Hanoi問(wèn)題算法:nxyz返回地址
執(zhí)行情況:遞歸工作棧保存內(nèi)容:形參n,x,y,z和返回地址返回地址用行編號(hào)表示hanio(n,x,y,z)=
move(x,z)當(dāng)n=1hanio(n-1,x,z,y)move(x,z)當(dāng)n>1hanio(n-1,y,x,z)語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)CHanoi問(wèn)題voidmove(char
getone,charputone){printf("%c--->%c\n",getone,putone);}voidhanoi(intn,charone,chartwo,charthree){if(n==1)move(one,three);else{hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);}}voidmain(){intm;
printf("Inputthenumberofdisks:");
scanf("%d",&m);
printf("Thestepstomoving%3ddisks:\n",m);
hanoi(m,'A','B','C');}BCA語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C
voidmain(){intm;
printf("Inputnumberofdisks”);
scanf("%d",&m);
printf(”Steps:%3ddisks”,m);
hanoi(m,'A','B','C');(0)}voidhanoi(intn,charx,chary,charz)(1){(2)if(n==1)(3)move(1,x,z);(4)else{(5)hanoi(n-1,x,z,y);(6)move(n,x,z);(7)hanoi(n-1,y,x,z);(8)}(9)}ABC1233ABC03ABC02ACB63ABC02ACB61ABC6ABC3ABC02ACB6語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C
voidmain(){intm;
printf("Inputthenumberofdisks
scanf("%d",&m);
printf("Thestepstomoving%3d
hanoi(m,'A','B','C');(0)}voidhanoi(intn,charx,chary,charz)(1){(2)if(n==1)(3)move(1,x,z);(4)else{(5)hanoi(n-1,x,z,y);(6)move(n,x,z);(7)hanoi(n-1,y,x,z);(8)}(9)}ABC3ABC02ACB61CAB8ABC3ABC02ACB63ABC03ABC02ACB6語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C
voidmain(){intm;
printf("Inputthenumberofdisks
scanf("%d",&m);
printf("Thestepstomoving%3d
hanoi(m,'A','B','C');(0)}voidhanoi(intn,charx,chary,charz)(1){(2)if(n==1)(3)move(1,x,z);(4)else{(5)hanoi(n-1,x,z,y);(6)move(n,x,z);(7)hanoi(n-1,y,x,z);(8)}(9)}ABC3ABC02BAC83ABC02BAC81BCA6ABC3ABC02BAC83ABC0語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C
voidmain(){intm;
printf("Inputthenumberofdisks
scanf("%d",&m);
printf("Thestepstomoving%3d
hanoi(m,'A','B','C');(0)}voidhanoi(intn,charx,chary,charz)(1){(2)if(n==1)(3)move(1,x,z);(4)else{(5)hanoi(n-1,x,z,y);(6)move(n,x,z);(7)hanoi(n-1,y,x,z);(8)}(9)}ABC3ABC02BAC81ABC8ABC3ABC02BAC83ABC0棧空3ABC02BAC8語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C8.7函數(shù)的作用域1、內(nèi)部函數(shù)函數(shù)一旦定義后就可被其它函數(shù)調(diào)用。但當(dāng)一個(gè)源程序由多個(gè)源文件組成時(shí),在一個(gè)源文件中定義的函數(shù)能否被其它源文件中的函數(shù)調(diào)用呢?為此,C語(yǔ)言又把函數(shù)分為兩類:
如果在一個(gè)源文件中定義的函數(shù)只能被本文件中的函數(shù)調(diào)用,而不能被同一源程序其它文件中的函數(shù)調(diào)用,這種函數(shù)稱為內(nèi)部函數(shù)。定義一般形式static類型說(shuō)明符函數(shù)名(形參表)例如:static
int
func(inta,intb){return(a>b?a:b);}內(nèi)部函數(shù)也稱為靜態(tài)函數(shù)。但此處?kù)o態(tài)static的含義已不是指存儲(chǔ)類型,而是指對(duì)函數(shù)的作用域只局限于本文件。因此在不同的源文件中定義同名的靜態(tài)函數(shù)不會(huì)引起混淆。語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C2、外部函數(shù)外部函數(shù)在整個(gè)源程序中都有效,其定義的一般形式為extern類型說(shuō)明符函數(shù)名(形參表)缺省時(shí),隱含為extern
prg1.cppexternintfunc2();voidmain(){func2();}intfunc1(inta,intb){return(a>b?a:b);}
prg2.cppexternintfunc1(inta,intb);staticintfunc2(){
intx,y,z;
scanf(“%d%d”,&x,&y);z=func1(x,y);return(z);}外部函數(shù)說(shuō)明
正確外部函數(shù)說(shuō)明錯(cuò)誤!錯(cuò)誤!內(nèi)部函數(shù)定義
引用外部函數(shù)
語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)C8.8函數(shù)的封裝
語(yǔ)言程序設(shè)計(jì)教程第二版
第八章函數(shù)CBlackBox…參數(shù)1參數(shù)2參數(shù)n返回值功能函數(shù)函數(shù)的封裝使外界對(duì)函數(shù)的影響僅限于幾個(gè)參數(shù)。函數(shù)的設(shè)計(jì)者可以專心于參數(shù)的處理和函數(shù)的實(shí)現(xiàn),完全不必關(guān)心調(diào)用者是什么。而函數(shù)對(duì)外界的影響也僅限于一個(gè)返回值和指針、數(shù)組類型的參數(shù)。函數(shù)的參數(shù)和返回值的設(shè)計(jì)是封裝中的關(guān)鍵一步!
盡可能少用全局變量,除非一個(gè)變量的值經(jīng)常被程序中多個(gè)模塊和函數(shù)使用,而且它的類型固定(隨著程
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《行政職業(yè)能力測(cè)驗(yàn)》2024年公務(wù)員考試阿克陶縣預(yù)測(cè)試卷含解析
- Unitech數(shù)據(jù)采集器PA690產(chǎn)品介紹
- 第16課 毛澤東開(kāi)辟井岡山道路(解析版)
- 2024年體育個(gè)人工作總結(jié)
- 《特斯拉電動(dòng)汽車》課件
- 新聞業(yè)的變革與挑戰(zhàn)
- 保險(xiǎn)公司人事工作總結(jié)
- 《水利工程質(zhì)量管理》課件
- 2023-2024年項(xiàng)目部安全管理人員安全培訓(xùn)考試題及參考答案【A卷】
- 保護(hù)瀕危動(dòng)物宣傳方案萬(wàn)能2022
- erdas2015操作手冊(cè)給客戶imagine
- 裝配式鋼筋混凝土簡(jiǎn)支T梁設(shè)計(jì)
- COMMERCIAL INVOICE 商業(yè)發(fā)票
- 大氣課程設(shè)計(jì)-—袋式除塵器
- 普天超五類檢測(cè)報(bào)告
- 會(huì)計(jì)師事務(wù)所業(yè)務(wù)培訓(xùn)制度
- CMM2-18錨桿機(jī)(新)說(shuō)明書(shū)
- 12噸汽車起重機(jī)基本技術(shù)規(guī)格資料
- WEB開(kāi)發(fā)基礎(chǔ)-2021秋本-計(jì)算機(jī)科學(xué)與技術(shù)本復(fù)習(xí)資料-國(guó)家開(kāi)放大學(xué)2022年1月期末考試復(fù)習(xí)資料
- 安徽省政協(xié)機(jī)關(guān)文件材料歸檔范圍
- 本質(zhì)安全理論綜述研究
評(píng)論
0/150
提交評(píng)論