高級(jí)語(yǔ)言程序設(shè)計(jì) 課件 第6章 函數(shù)_第1頁(yè)
高級(jí)語(yǔ)言程序設(shè)計(jì) 課件 第6章 函數(shù)_第2頁(yè)
高級(jí)語(yǔ)言程序設(shè)計(jì) 課件 第6章 函數(shù)_第3頁(yè)
高級(jí)語(yǔ)言程序設(shè)計(jì) 課件 第6章 函數(shù)_第4頁(yè)
高級(jí)語(yǔ)言程序設(shè)計(jì) 課件 第6章 函數(shù)_第5頁(yè)
已閱讀5頁(yè),還剩45頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第6章函數(shù)6.1函數(shù)的概念和模塊化程序設(shè)計(jì)函數(shù)聲明6.2

函數(shù)的參數(shù)和數(shù)據(jù)傳遞方式6.36.4變量的存儲(chǔ)類(lèi)型和作用域6.5函數(shù)的嵌套調(diào)用和遞歸調(diào)用6.6常用庫(kù)函數(shù)本章內(nèi)容導(dǎo)讀本章主要介紹函數(shù)的定義和調(diào)用方法,函數(shù)之間數(shù)據(jù)傳遞方式以及常用的庫(kù)函數(shù),函數(shù)的嵌套調(diào)用和遞歸調(diào)用以及模塊化程序設(shè)計(jì)。通過(guò)學(xué)習(xí)本章,讀者應(yīng)掌握以下內(nèi)容:了解模塊化程序設(shè)計(jì)方法;掌握用戶(hù)自定義函數(shù)的定義和調(diào)用方法;掌握函數(shù)聲明的作用;掌握函數(shù)調(diào)用時(shí)的數(shù)據(jù)傳遞方式;了解變量生存期和作用域的概念;了解遞歸函數(shù)的概念和一般設(shè)計(jì)方法。函數(shù)是一段相對(duì)獨(dú)立、功能完整的程序。一個(gè)C語(yǔ)言程序是由一個(gè)或多個(gè)函數(shù)組成,每個(gè)函數(shù)分別對(duì)應(yīng)一個(gè)功能模塊。特點(diǎn)(1)一個(gè)C程序由一個(gè)或多個(gè)函數(shù)組成,其中必須有且只能有一個(gè)main函數(shù)(稱(chēng)為主函數(shù))。(2)C程序的執(zhí)行從主函數(shù)開(kāi)始,如果在主函數(shù)中調(diào)用其他函數(shù),調(diào)用后返回到主函數(shù),并在主函數(shù)中結(jié)束整個(gè)程序的運(yùn)行。(3)主函數(shù)可以調(diào)用其他函數(shù),但其他函數(shù)不能調(diào)用主函數(shù)。主函數(shù)由操作系統(tǒng)調(diào)用,其他函數(shù)之間可以互相調(diào)用。(4)函數(shù)之間沒(méi)有從屬關(guān)系,互相獨(dú)立,不能嵌套定義。1、函數(shù)的概念

6.1函數(shù)的概念和模塊化程序設(shè)計(jì)從函數(shù)定義的角度劃分庫(kù)函數(shù)(又稱(chēng)標(biāo)準(zhǔn)庫(kù)函數(shù)):由C語(yǔ)言的函數(shù)庫(kù)提供,即C語(yǔ)言自身已經(jīng)定義好的函數(shù),在包含相應(yīng)頭文件后用戶(hù)可以直接使用;用戶(hù)函數(shù)(又稱(chēng)自定義函數(shù)):是用戶(hù)根據(jù)需要自行定義的完成某一特定功能的一段程序。從函數(shù)有無(wú)參數(shù)的角度劃分有參函數(shù):定義函數(shù)時(shí)有參數(shù)的稱(chēng)為有參函數(shù);無(wú)參函數(shù):定義函數(shù)時(shí)無(wú)參數(shù)的稱(chēng)為無(wú)參函數(shù)。1、函數(shù)的概念

6.1函數(shù)的概念和模塊化程序設(shè)計(jì)從函數(shù)有無(wú)返回值的角度劃分有返回值函數(shù):調(diào)用后返回一個(gè)值;無(wú)返回值函數(shù):調(diào)用后不返回值。從函數(shù)作用范圍的角度劃分C語(yǔ)言允許將一個(gè)源程序分放在不同的程序文件中,采用分塊編譯、連接生成一個(gè)目標(biāo)程序,其中每個(gè)程序文件稱(chēng)為一個(gè)“編譯單元”。每個(gè)編譯單元可以包含若干個(gè)函數(shù)。外部函數(shù):可以被任何編譯單元調(diào)用的;內(nèi)部函數(shù):只能在本編譯單元中被調(diào)用。1、函數(shù)的概念

6.1函數(shù)的概念和模塊化程序設(shè)計(jì)函數(shù)定義的一般形式數(shù)據(jù)類(lèi)型符函數(shù)名(形式參數(shù)表){數(shù)據(jù)定義語(yǔ)句部分;執(zhí)行語(yǔ)句部分;}函數(shù)首部(函數(shù)頭)函數(shù)體

例:兩個(gè)數(shù)之和的函數(shù)。doubleadd(doublex,doubley){

doublez;z=x+y;

returnz;

}函數(shù)體:{}中的內(nèi)容,包括說(shuō)明語(yǔ)句和執(zhí)行語(yǔ)句??蘸瘮?shù):函數(shù)體為空的函數(shù),例{},便于擴(kuò)充和細(xì)化程序。說(shuō)明(1)任何函數(shù)(包括主函數(shù))都是由函數(shù)首部和函數(shù)體兩部分組成。(2)函數(shù)首部末尾不能加分號(hào)。(3)“函數(shù)名”是一個(gè)標(biāo)識(shí)符,在同一個(gè)編譯單元中函數(shù)不能重名。(4)C語(yǔ)言中,所有函數(shù)(包括主函數(shù))都是平行的。一個(gè)函數(shù)的定義,可以放在程序中的任意位置,主函數(shù)之前或之后。但是在一個(gè)函數(shù)的函數(shù)體內(nèi)不能再定義另一個(gè)函數(shù),即不允許函數(shù)的嵌套定義。2、函數(shù)的定義6.1函數(shù)的概念和模塊化程序設(shè)計(jì)

無(wú)參函數(shù)定義格式

數(shù)據(jù)類(lèi)型符或void函數(shù)名(void){數(shù)據(jù)定義語(yǔ)句部分;執(zhí)行語(yǔ)句部分;}

有參函數(shù)定義格式

數(shù)據(jù)類(lèi)型符或void函數(shù)名(形式參數(shù)表){定義語(yǔ)句部分;執(zhí)行語(yǔ)句部分;}2、函數(shù)的定義6.1函數(shù)的概念和模塊化程序設(shè)計(jì)

無(wú)返回值函數(shù)定義格式

void函數(shù)名(形式參數(shù)表或void)

{數(shù)據(jù)定義語(yǔ)句部分;執(zhí)行語(yǔ)句部分;

}

有返回值函數(shù)定義格式數(shù)據(jù)類(lèi)型符函數(shù)名(形式參數(shù)表或void)

{定義語(yǔ)句部分;執(zhí)行語(yǔ)句部分;}2、函數(shù)的定義6.1函數(shù)的概念和模塊化程序設(shè)計(jì)C程序是通過(guò)對(duì)函數(shù)的調(diào)用來(lái)執(zhí)行函數(shù)體。被調(diào)函數(shù)應(yīng)該先定義,后調(diào)用。格式

函數(shù)名([實(shí)際參數(shù)表]);調(diào)用方式

(1)以函數(shù)語(yǔ)句的方式

函數(shù)名(實(shí)際參數(shù)表);(2)以函數(shù)表達(dá)式的方式

變量=帶函數(shù)的表達(dá)式;(3)以函數(shù)實(shí)參的方式func1(x,y,z);c=max(a,b);printf("thelargenumberis%f",add(x,y));3、函數(shù)的調(diào)用6.1函數(shù)的概念和模塊化程序設(shè)計(jì)【例6-1】編寫(xiě)一個(gè)程序求解從m個(gè)元素選n個(gè)元素的組合數(shù)程序。計(jì)算公式:分析:用函數(shù)f(x)求x!;cmn=f(m)/f(n)/f(m-n);longf(x)intx;{

longy;

for(y=1;x>0;--x)

y=y*x;

return(y);}#include<stdio.h>int

main(void){

int

m,n;

longcmn,temp;

longf();

printf("Entermandn:");

scanf("%d%d",&m,&n);

cmn=f(m);

temp=f(n);

cmn=cmn/temp;

cmn=cmn/f(m-n);

printf("Thecombination:%ld\n",cmn);

return0;}Entermandn:43Thecombination:4函數(shù)的形式參數(shù)和實(shí)際參數(shù)形式參數(shù)(簡(jiǎn)稱(chēng)形參):是在函數(shù)定義中設(shè)置的,用來(lái)接收從主調(diào)函數(shù)傳來(lái)的對(duì)應(yīng)實(shí)參的數(shù)據(jù)。實(shí)際參數(shù)(簡(jiǎn)稱(chēng)實(shí)參):是調(diào)用函數(shù)時(shí)的實(shí)際參數(shù),實(shí)參可以是常量、變量或表達(dá)式,也可以是函數(shù)的返回值,無(wú)論哪種形式必須有確定的值。注意(1)形參在調(diào)用時(shí)才被分配內(nèi)存空間,調(diào)用結(jié)束后釋放。(2)實(shí)參可以是常量、變量或表達(dá)式,但要求有確定值。(3)實(shí)參在數(shù)量、類(lèi)型和順序上與形參必須一一對(duì)應(yīng)和匹配。如果參數(shù)的數(shù)量不一致,則會(huì)出現(xiàn)編譯錯(cuò)誤;如果參數(shù)的順序不一致,則傳遞到被調(diào)函數(shù)中的數(shù)據(jù)不合邏輯;如果參數(shù)的類(lèi)型不一致,則按照形參類(lèi)型對(duì)實(shí)參進(jìn)行自動(dòng)轉(zhuǎn)換,如果是不能進(jìn)行轉(zhuǎn)換的類(lèi)型,則出現(xiàn)編譯錯(cuò)誤。(4)實(shí)參向形參的單向傳遞,“值傳遞”,即只由實(shí)參傳給形參,而不能由形參傳回給實(shí)參。3、函數(shù)的調(diào)用6.1函數(shù)的概念和模塊化程序設(shè)計(jì)返回值類(lèi)型函數(shù)返回值的類(lèi)型即函數(shù)類(lèi)型,是指返回給主調(diào)函數(shù)的結(jié)果的類(lèi)型,應(yīng)根據(jù)具體函數(shù)的功能確定。如果函數(shù)不返回任何值,則函數(shù)返回值類(lèi)型定義為“void”,稱(chēng)為“空類(lèi)型”。有參函數(shù)的返回值,是通過(guò)函數(shù)中的return語(yǔ)句獲得。return語(yǔ)句功能:返回調(diào)用函數(shù),并將“返回值表達(dá)式”的值帶給調(diào)用函數(shù)。使用方式(1)無(wú)返回值的函數(shù)return;(2)有返回值的函數(shù)return(返回值表達(dá)式);或return返回值表達(dá)式;4、函數(shù)的返回6.1函數(shù)的概念和模塊化程序設(shè)計(jì)說(shuō)明(1)一個(gè)函數(shù)中可以有多個(gè)return語(yǔ)句

(2)若無(wú)return語(yǔ)句,則執(zhí)行到函數(shù)體末尾后,并不是不返回一個(gè)值,而是返回一個(gè)不確定的值。

(3)若無(wú)值返回,則函數(shù)應(yīng)定義為void類(lèi)型。

(4)return語(yǔ)句中表達(dá)式的類(lèi)型與函數(shù)類(lèi)型一致。若不一致,以函數(shù)值類(lèi)型為準(zhǔn)。4、函數(shù)的返回6.1函數(shù)的概念和模塊化程序設(shè)計(jì)(1)暫停執(zhí)行函數(shù)調(diào)用所在的語(yǔ)句,轉(zhuǎn)向執(zhí)行被調(diào)函數(shù)。(2)為函數(shù)的所有形參分配內(nèi)存,再計(jì)算所有實(shí)參的值,依次賦予對(duì)應(yīng)的形參。若是無(wú)參函數(shù),則不執(zhí)行這一操作。(3)進(jìn)入函數(shù)體,先執(zhí)行數(shù)據(jù)定義語(yǔ)句部分,為函數(shù)體中定義的變量、數(shù)組等分配內(nèi)存。(4)執(zhí)行函數(shù)體中的執(zhí)行語(yǔ)句部分。如果是無(wú)返回值的函數(shù),則執(zhí)行到返回語(yǔ)句;如果返回語(yǔ)句被省略,則執(zhí)行到函數(shù)體的右花括號(hào);如果是有返回值的函數(shù),則執(zhí)行到返回語(yǔ)句時(shí),計(jì)算表達(dá)式的值作為函數(shù)的返回值。(5)收回分配給函數(shù)體中定義的變量、數(shù)組、形參等的內(nèi)存單元。(6)返回到主調(diào)函數(shù)繼續(xù)執(zhí)行。如果函數(shù)調(diào)用的形式是“語(yǔ)句”,則執(zhí)行其后面的語(yǔ)句;如果函數(shù)調(diào)用的形式是“表達(dá)式”,則繼續(xù)執(zhí)行表達(dá)式所在的語(yǔ)句。5、函數(shù)的調(diào)用過(guò)程6.1函數(shù)的概念和模塊化程序設(shè)計(jì)C語(yǔ)言中,一個(gè)大的程序由許多源程序文件(又稱(chēng)程序模塊,通常是一些相關(guān)函數(shù)的集合)組成,而源程序文件由預(yù)編譯和許多函數(shù)組成。C語(yǔ)言程序源文件(程序模塊)結(jié)構(gòu)包含文件,例如#include<stdio.h>宏定義,例如#definePI3.14159條件編譯,例如#if…#else…#endif函數(shù)聲明,例如定義函數(shù)的原型全局變量說(shuō)明,例如函數(shù)外定義的變量函數(shù)定義源文件包含文件宏定義條件編譯函數(shù)預(yù)說(shuō)明全局變量說(shuō)明函數(shù)模塊定義函數(shù)模塊定義……大程序6、模塊化程序設(shè)計(jì)方法6.1函數(shù)的概念和模塊化程序設(shè)計(jì)在調(diào)用函數(shù)之前應(yīng)當(dāng)對(duì)調(diào)用的函數(shù)進(jìn)行聲明,讓編譯程序預(yù)先了解函數(shù)的有關(guān)信息。格式[存儲(chǔ)類(lèi)型][數(shù)據(jù)類(lèi)型符]函數(shù)名(形參類(lèi)型[形參名1][,形參類(lèi)型[形參名2],…]);說(shuō)明(1)函數(shù)聲明是一條語(yǔ)句,末尾加分號(hào);而函數(shù)首部不是語(yǔ)句,末尾不加分號(hào)。(2)函數(shù)聲明與函數(shù)定義是不同的。函數(shù)定義是編寫(xiě)一段程序,除了指定函數(shù)名、返回值類(lèi)型、形參名、形參類(lèi)型外,還有函數(shù)體;而函數(shù)聲明只是把函數(shù)名、返回值類(lèi)型、形參名、形參類(lèi)型等通知編譯程序,以便在調(diào)用該函數(shù)時(shí)系統(tǒng)據(jù)此對(duì)照檢查,它沒(méi)有函數(shù)體。例如,int

max(int

x,inty){……}的函數(shù)原型是intmax(int,int);6.2函數(shù)的聲明若主調(diào)函數(shù)與被調(diào)函數(shù)不在同一編譯單元中,則在定義函數(shù)的編譯單元中必須將該函數(shù)定義為外部函數(shù),同時(shí)在主調(diào)函數(shù)的函數(shù)體中或主調(diào)函數(shù)所在編譯單元的開(kāi)頭將被調(diào)函數(shù)進(jìn)行聲明:extern數(shù)據(jù)類(lèi)型符函數(shù)名(形式參數(shù)表);;若主函數(shù)與被調(diào)函數(shù)在同一編譯單元中,則可以不說(shuō)明其函數(shù)原型。同時(shí)C語(yǔ)言又規(guī)定,若被調(diào)函數(shù)的函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前,則在主調(diào)函數(shù)中可以省略對(duì)被調(diào)函數(shù)的聲明。因?yàn)樵谡{(diào)用之前,編譯程序已經(jīng)知道了被調(diào)函數(shù)的函數(shù)類(lèi)型、參數(shù)個(gè)數(shù)、類(lèi)型和順序等信息。除了上述兩種情況,都需要對(duì)被調(diào)函數(shù)進(jìn)行聲明。

6.2函數(shù)的聲明被調(diào)用函數(shù)若為系統(tǒng)函數(shù)(庫(kù)函數(shù)):除了少數(shù)庫(kù)函數(shù)(如scanf()、printf())外,都要求在本文件開(kāi)頭用包含命令包含被調(diào)函數(shù)的信息。用戶(hù)函數(shù)函數(shù)聲明的幾種形式

數(shù)據(jù)類(lèi)型符函數(shù)名(形參類(lèi)型形參名1,形參類(lèi)型形參名2,……);

數(shù)據(jù)類(lèi)型符函數(shù)名(形參類(lèi)型1,形參類(lèi)型2,……);

數(shù)據(jù)類(lèi)型符函數(shù)名();intmax(inta,intb);intmax(int,int);intmax();6.2函數(shù)的聲明說(shuō)明(1)函數(shù)原型告訴編譯程序函數(shù)返回的數(shù)據(jù)類(lèi)型、函數(shù)所要接收的參數(shù)個(gè)數(shù)、參數(shù)類(lèi)型和參數(shù)順序,編譯程序利用函數(shù)原型校驗(yàn)函數(shù)調(diào)用是否正確。(2)函數(shù)原型中可以只說(shuō)明形參類(lèi)型和形參個(gè)數(shù),而無(wú)需說(shuō)明形參名。例如,對(duì)函數(shù)intmax(int

x,inty){……}的聲明以下兩種形式均可:

int

max(int,int);

int

max(int

x,int

y);(3)函數(shù)原型、函數(shù)定義、函數(shù)調(diào)用要保持一致。和函數(shù)原型不匹配的函數(shù)調(diào)用會(huì)導(dǎo)致語(yǔ)法錯(cuò)誤;函數(shù)原型和函數(shù)定義不一致,也會(huì)產(chǎn)生錯(cuò)誤。6.2函數(shù)的聲明說(shuō)明(4)函數(shù)原型可以在主調(diào)函數(shù)中聲明;也可以在所有函數(shù)的外部(如文件聲明處)進(jìn)行聲明。這種情況下,在該聲明之后定義的所有函數(shù)均可以調(diào)用該函數(shù),而不必再聲明。(5)如果程序中沒(méi)有包含函數(shù)原型,則編譯程序會(huì)用第一次出現(xiàn)的該函數(shù)(函數(shù)定義或函數(shù)原型)來(lái)構(gòu)造函數(shù)原型。6.2函數(shù)的聲明函數(shù)之間數(shù)據(jù)傳遞方式值傳遞地址傳遞返回值全局變量傳遞前兩種方式是利用定義函數(shù)時(shí)設(shè)置的形參和調(diào)用函數(shù)時(shí)給出的實(shí)參來(lái)傳遞數(shù)據(jù)的。

6.3函數(shù)的參數(shù)和數(shù)據(jù)傳遞方式

值傳遞方式是在形參和實(shí)參之間傳遞數(shù)據(jù)的一種方式。傳遞方式傳遞的是參數(shù)值。判斷的唯一方法是看函數(shù)定義時(shí)的形參是不是變量形式如果形參是變量,則是值傳遞方式。1、值傳遞方式6.3函數(shù)的參數(shù)和數(shù)據(jù)傳遞方式數(shù)組作為函數(shù)參數(shù)的兩種形式

數(shù)組元素作為函數(shù)實(shí)參數(shù)組元素只能用作函數(shù)實(shí)參,其用法與普通變量完全相同,即在發(fā)生函數(shù)調(diào)用時(shí),把數(shù)組元素的值傳送給形參,實(shí)現(xiàn)單向值傳送。數(shù)組元素作為實(shí)參時(shí),只要數(shù)組的類(lèi)型和函數(shù)形參的類(lèi)型一致即可,并不要求函數(shù)的形參也是下標(biāo)變量。換言之,對(duì)數(shù)組元素的處理是按普通變量對(duì)待的。普通變量或下標(biāo)變量作為函數(shù)參數(shù)時(shí),形參變量和實(shí)參變量由編譯程序分配不同的內(nèi)存單元。在函數(shù)調(diào)用時(shí)進(jìn)行值傳送,把實(shí)參變量的值賦予形參變量。

2、數(shù)組作為函數(shù)參數(shù)的數(shù)據(jù)傳遞方式6.3函數(shù)的參數(shù)和數(shù)據(jù)傳遞方式數(shù)組名作為函數(shù)參數(shù)(形參和實(shí)參)數(shù)組名作函數(shù)參數(shù)時(shí),既可以作形參,也可以作實(shí)參。數(shù)組名作函數(shù)參數(shù)時(shí),要求形參和相對(duì)應(yīng)的實(shí)參都必須是類(lèi)型相同的數(shù)組(或指向數(shù)組的指針變量),都必須有明確的數(shù)組說(shuō)明。如果形參是數(shù)組名,則傳遞方式稱(chēng)為“地址傳遞方式”

2、數(shù)組作為函數(shù)參數(shù)的數(shù)據(jù)傳遞方式6.3函數(shù)的參數(shù)和數(shù)據(jù)傳遞方式當(dāng)一維數(shù)組名做形參時(shí)可以指定數(shù)組的長(zhǎng)度,也可以不指定數(shù)組的長(zhǎng)度,而只在數(shù)組名后面跟一對(duì)空的方括號(hào)。當(dāng)多維數(shù)組名做實(shí)參和形參時(shí),形參數(shù)組可以省略第一維的長(zhǎng)度說(shuō)明,但第二維及以上的長(zhǎng)度說(shuō)明不能省略。

不是在形參和實(shí)參之間進(jìn)行數(shù)據(jù)傳遞,而是通過(guò)函數(shù)調(diào)用直接返回一個(gè)值到主調(diào)函數(shù)。因此,這種方式通常用于從被調(diào)函數(shù)向主調(diào)函數(shù)回傳值。注意(1)函數(shù)首部中需要有“數(shù)據(jù)類(lèi)型符”,說(shuō)明該函數(shù)返回值的數(shù)據(jù)類(lèi)型。(2)函數(shù)體中需要有語(yǔ)句“return(表達(dá)式);”,其中的表達(dá)式即是函數(shù)的返回值。3、利用返回值的數(shù)據(jù)傳遞方式6.3函數(shù)的參數(shù)和數(shù)據(jù)傳遞方式變量存儲(chǔ)類(lèi)型自動(dòng)型(auto)寄存器型(register)外部型(extern)靜態(tài)型(static)變量存儲(chǔ)方式靜態(tài)存儲(chǔ)方式在編譯時(shí)由系統(tǒng)分配固定的存儲(chǔ)空間,直到程序運(yùn)行結(jié)束后才釋放所占用的存儲(chǔ)空間。動(dòng)態(tài)存儲(chǔ)方式在程序運(yùn)行時(shí)根據(jù)需要?jiǎng)討B(tài)地分配和釋放存儲(chǔ)空間。自動(dòng)型和寄存型器變量屬于動(dòng)態(tài)存儲(chǔ)方式,外部型和靜態(tài)型變量屬于靜態(tài)存儲(chǔ)方式。1、變量的存儲(chǔ)類(lèi)型6.4變量的存儲(chǔ)類(lèi)型和作用域自動(dòng)型變量

定義格式

[auto]數(shù)據(jù)類(lèi)型變量表;

說(shuō)明

(1)自動(dòng)變量屬于動(dòng)態(tài)存儲(chǔ)方式。在函數(shù)中定義的自動(dòng)變量,只在該函數(shù)內(nèi)有效;函數(shù)被調(diào)用時(shí)分配存儲(chǔ)空間,調(diào)用結(jié)束就釋放。在復(fù)合語(yǔ)句中定義的自動(dòng)變量,只在該復(fù)合語(yǔ)句中有效;退出復(fù)合語(yǔ)句后,也不能再使用,否則將引起錯(cuò)誤。(2)定義時(shí)如果沒(méi)有初始化,則其值是不確定的。如果初始化,則賦初值操作是在調(diào)用時(shí)進(jìn)行的,且每次調(diào)用都要重新賦一次初值。(3)由于自動(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)型變量!1、變量的存儲(chǔ)類(lèi)型6.4變量的存儲(chǔ)類(lèi)型和作用域靜態(tài)型變量定義格式

static數(shù)據(jù)類(lèi)型變量表;

說(shuō)明(1)靜態(tài)內(nèi)部變量屬于靜態(tài)存儲(chǔ)。在程序執(zhí)行過(guò)程中,即使所在函數(shù)調(diào)用結(jié)束也不釋放。換言之,在程序執(zhí)行期間,靜態(tài)內(nèi)部變量始終存在,但其它函數(shù)是不能引用它們的。(2)定義但不初始化,則自動(dòng)賦以0(整型和實(shí)型)或‘\0’(字符型);且每次調(diào)用它們所在的函數(shù)時(shí),不再重新賦初值,只是保留上次調(diào)用結(jié)束時(shí)的值。(3)何時(shí)使用靜態(tài)內(nèi)部變量:需要保留函數(shù)上一次調(diào)用結(jié)束時(shí)的值。變量只被引用而不改變其值。1、變量的存儲(chǔ)類(lèi)型6.4變量的存儲(chǔ)類(lèi)型和作用域寄存器型變量一般情況下,變量的值都是存儲(chǔ)在內(nèi)存。為提高執(zhí)行效率,C語(yǔ)言允許將局部變量的值存放到寄存器,這種變量稱(chēng)為寄存器變量。

定義格式register數(shù)據(jù)類(lèi)型變量表;

說(shuō)明(1)只有局部變量才能定義為寄存器變量,全局變量不行。(2)對(duì)寄存器變量的實(shí)際處理,隨系統(tǒng)而異。例如,微機(jī)上的MSC和TC將寄存器變量實(shí)際當(dāng)作自動(dòng)變量處理。(3)允許使用的寄存器數(shù)目是有限的,不能定義任意多個(gè)寄存器變量。1、變量的存儲(chǔ)類(lèi)型6.4變量的存儲(chǔ)類(lèi)型和作用域外部型變量定義格式

extern數(shù)據(jù)類(lèi)型外部變量表;

說(shuō)明:外部型變量是專(zhuān)門(mén)用于在多個(gè)編譯單元之間傳遞數(shù)據(jù)的。當(dāng)編譯單元A需要使用在編譯單元B中定義的變量,則編譯單元A需要將該變量聲明為外部型變量,以便C編譯系統(tǒng)在編譯單元A之外的其它編譯單元中尋找該變量的定義,而在編譯單元B中需要定義該變量的存儲(chǔ)類(lèi)型和數(shù)據(jù)類(lèi)型。關(guān)鍵字extern與auto、static和register的用法不同,后三個(gè)關(guān)鍵字是在定義變量時(shí)加關(guān)鍵字,而extern是對(duì)已經(jīng)定義的全局變量進(jìn)行聲明。注意:函數(shù)內(nèi)的extern變量說(shuō)明,表示引用本源文件中的外部變量;函數(shù)外(通常在文件開(kāi)頭)的extern變量說(shuō)明,表示引用其它文件中的外部變量。1、變量的存儲(chǔ)類(lèi)型6.4變量的存儲(chǔ)類(lèi)型和作用域變量的生存期從系統(tǒng)為變量分配內(nèi)存單元(或寄存器)開(kāi)始到系統(tǒng)收回內(nèi)存單元(或寄存器)的期間稱(chēng)為“變量的生存期”。在變量的生存期以外使用該變量會(huì)導(dǎo)致編譯錯(cuò)誤。變量的作用域C語(yǔ)言中所有的變量都有其作用域。變量說(shuō)明的位置不同,其作用域也不同。2、變量的生存期和作用域6.4變量的存儲(chǔ)類(lèi)型和作用域intf1(inta)/*函數(shù)f1*/{

int

b,c;

……} /*a、b、c作用域:僅限于函數(shù)f1()中*/

intf2(intx)/*函數(shù)f2*/{

int

y,z;

……} /*x、y、z作用域:僅限于函數(shù)f2()中*/intmain(void){

int

m,n;

……} /*m、n作用域:僅限于函數(shù)main()中*/說(shuō)明(1)主函數(shù)中定義的內(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)。2、變量的生存期和作用域6.4變量的存儲(chǔ)類(lèi)型和作用域全局變量

定義:生存期覆蓋了定義點(diǎn)到整個(gè)程序結(jié)束的變量。局部變量定義:生存期只覆蓋了某個(gè)函數(shù)(或復(fù)合語(yǔ)句)的變量。對(duì)于局部變量,聲明存儲(chǔ)類(lèi)型的作用是指定變量的存儲(chǔ)位置(靜態(tài)存儲(chǔ)區(qū)或動(dòng)態(tài)存儲(chǔ)區(qū))和生存期;對(duì)于全局變量,聲明存儲(chǔ)類(lèi)型的作用是擴(kuò)展或限制變量的作用域。2、變量的生存期和作用域6.4變量的存儲(chǔ)類(lèi)型和作用域內(nèi)部變量

定義:在一個(gè)函數(shù)(或復(fù)合語(yǔ)句)內(nèi)部定義的變量。作用域:該函數(shù)(或復(fù)合語(yǔ)句)范圍內(nèi)有效,即只在包含變量定義的函數(shù)(或復(fù)合語(yǔ)句)內(nèi)部,才能使用該變量,在此函數(shù)(或復(fù)合語(yǔ)句)之外則不能使用。說(shuō)明(1)主函數(shù)中定義的內(nèi)部變量,只能在主函數(shù)中使用,其它函數(shù)不能使用。同時(shí),主函數(shù)中也不能使用其它函數(shù)中定義的內(nèi)部變量。因?yàn)橹骱瘮?shù)也是一個(gè)函數(shù),與其它函數(shù)是平行關(guān)系。這一點(diǎn)是與其它高級(jí)語(yǔ)言不同。(2)形參變量也是內(nèi)部變量,僅限于函數(shù)內(nèi)使用。(3)允許在不同函數(shù)中使用重名的變量,它們代表不同的對(duì)象,分配不同的內(nèi)存單元,互不干擾,也不會(huì)發(fā)生混淆。2、變量的生存期和作用域6.4變量的存儲(chǔ)類(lèi)型和作用域說(shuō)明(4)復(fù)合語(yǔ)句中也可定義變量,所定義的變量是內(nèi)部變量,其作用域只在該復(fù)合語(yǔ)句范圍內(nèi)。例如,

if(i>j) {

int

k; k=i;i=j;j=k;k有效 }

2、變量的生存期和作用域6.4變量的存儲(chǔ)類(lèi)型和作用域外部變量定義:在函數(shù)外部定義的變量。作用域:從定義位置開(kāi)始到本文件結(jié)束為止。它不屬于任何一個(gè)函數(shù),可被作用域內(nèi)的所有函數(shù)直接引用。說(shuō)明(1)外部變量可以加強(qiáng)函數(shù)模塊之間的數(shù)據(jù)聯(lián)系,但又使這些函數(shù)依賴(lài)這些外部變量,因而使得這些函數(shù)的獨(dú)立性降低。從模塊化程序設(shè)計(jì)的觀(guān)點(diǎn)來(lái)看這是不利的,因此不是非用不可時(shí),不建議使用外部變量。(2)在同一源程序文件中,允許外部變量和內(nèi)部變量重名。如果外部變量和內(nèi)部變量重名,則在內(nèi)部變量的作用域內(nèi),外部變量將被屏蔽而不起作用。2、變量的生存期和作用域6.4變量的存儲(chǔ)類(lèi)型和作用域說(shuō)明(3)外部變量的作用域是從定義點(diǎn)到本文件結(jié)束。如果定義點(diǎn)之前的函數(shù)需要使用這些外部變量時(shí),需要在函數(shù)內(nèi)對(duì)被使用的外部變量進(jìn)行說(shuō)明。外部變量說(shuō)明的一般形式為:extern數(shù)據(jù)類(lèi)型外部變量1[,外部變量2……];注意:外部變量的定義和外部變量的說(shuō)明不同。外部變量的定義,必須在所有的函數(shù)之外,且只能定義一次。而外部變量的說(shuō)明,出現(xiàn)在需要使用該全局變量的函數(shù)內(nèi),而且可以出現(xiàn)多次。2、變量的生存期和作用域6.4變量的存儲(chǔ)類(lèi)型和作用域靜態(tài)局部變量和靜態(tài)外部變量同屬靜態(tài)存儲(chǔ)方式,區(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次給它賦值的操作決定。

2、變量的生存期和作用域6.4變量的存儲(chǔ)類(lèi)型和作用域務(wù)必牢記:把局部變量改變?yōu)殪o態(tài)內(nèi)部變量后,改變了它的存儲(chǔ)方式,即改變了它的生存期。把外部變量改變?yōu)殪o態(tài)外部變量后,改變了它的作用域,限制了它的使用范圍。因此,關(guān)鍵字“static”在不同的地方所起的作用是不同的。2、變量的生存期和作用域6.4變量的存儲(chǔ)類(lèi)型和作用域不是在形參和實(shí)參之間傳遞數(shù)據(jù),而是利用在主調(diào)函數(shù)和被調(diào)函數(shù)中都有效的全局變量,在主調(diào)函數(shù)和被調(diào)函數(shù)之間共享數(shù)據(jù)。如前所述,全局變量是生存期覆蓋了定義點(diǎn)到整個(gè)程序結(jié)束的變量。具體地,全局變量有兩種,一是在任何函數(shù)之外定義的全局變量,其作用域覆蓋了定義點(diǎn)到整個(gè)程序結(jié)束之間的所有函數(shù),這種全局變量叫做“外部變量”;二是在函數(shù)體內(nèi)部定義為static型的變量,該變量在從函數(shù)返回后,仍保留所分配的內(nèi)存(活著),但是不能使用,其作用域仍是該函數(shù)體內(nèi)。這種全局變量叫做“內(nèi)部變量”。因此,在函數(shù)之間利用全局變量傳遞數(shù)據(jù),只能使用“外部變量”。3、利用全局變量的數(shù)據(jù)傳遞方式6.4變量的存儲(chǔ)類(lèi)型和作用域遞歸函數(shù):又稱(chēng)自調(diào)用函數(shù),簡(jiǎn)潔但不一定高效。三個(gè)條件:(1)遞歸問(wèn)題的規(guī)律;

(2)通過(guò)轉(zhuǎn)化解決問(wèn)題;

(3)有終止遞歸的條件?!纠?-2】階乘的遞歸函數(shù)。

分析:f(n)=n*f(n-1);f(1)=1;intf(n)intn;{if(n==1)return(1);elsereturn(n*f(n-1));}intmain(void){intx=4;printf("n!=%d\n",f(x));return0;}n!=246.5函數(shù)的嵌套調(diào)用和遞歸調(diào)用在執(zhí)行被調(diào)用函數(shù)時(shí),被調(diào)用函數(shù)又調(diào)用了其它函數(shù)。這與其它語(yǔ)言的子程序嵌套調(diào)用的情形類(lèi)似。main()函數(shù)①調(diào)用f1()函數(shù):結(jié)

束f1()函數(shù)調(diào)用f2()函數(shù):后續(xù)語(yǔ)句:后續(xù)語(yǔ)句:返

回f2()函數(shù)返

回②③④⑤⑥⑦⑧⑨1、函數(shù)的嵌套調(diào)用6.5函數(shù)的嵌套調(diào)用和遞歸調(diào)用【例6-3】計(jì)算s=1k+2k+3k+……+Nk

。/*功能:函數(shù)的嵌套調(diào)用*/#include<stdio.h>#defineK4#defineN5longf1(int

n,intk) /*計(jì)算n的k次方*/{longpower=n;

inti;for(i=1;i<k;i++)power*=n;returnpower;}longf2(int

n,intk) /*計(jì)算1到n的k次方之累加和*/{longsum=0;

inti;for(i=1;i<=n;i++)sum+=f1(i,k);returnsum;}intmain(void){printf("Sumof%dpowersofintegersfrom1to%d=",K,N);

printf("%d\n",f2(N,K));

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論