




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第6章函數(shù)6.1函數(shù)的概念和模塊化程序設(shè)計(jì)函數(shù)聲明6.2
函數(shù)的參數(shù)和數(shù)據(jù)傳遞方式6.36.4變量的存儲類型和作用域6.5函數(shù)的嵌套調(diào)用和遞歸調(diào)用6.6常用庫函數(shù)本章內(nèi)容導(dǎo)讀本章主要介紹函數(shù)的定義和調(diào)用方法,函數(shù)之間數(shù)據(jù)傳遞方式以及常用的庫函數(shù),函數(shù)的嵌套調(diào)用和遞歸調(diào)用以及模塊化程序設(shè)計(jì)。通過學(xué)習(xí)本章,讀者應(yīng)掌握以下內(nèi)容:了解模塊化程序設(shè)計(jì)方法;掌握用戶自定義函數(shù)的定義和調(diào)用方法;掌握函數(shù)聲明的作用;掌握函數(shù)調(diào)用時(shí)的數(shù)據(jù)傳遞方式;了解變量生存期和作用域的概念;了解遞歸函數(shù)的概念和一般設(shè)計(jì)方法。函數(shù)是一段相對獨(dú)立、功能完整的程序。一個(gè)C語言程序是由一個(gè)或多個(gè)函數(shù)組成,每個(gè)函數(shù)分別對應(yīng)一個(gè)功能模塊。特點(diǎn)(1)一個(gè)C程序由一個(gè)或多個(gè)函數(shù)組成,其中必須有且只能有一個(gè)main函數(shù)(稱為主函數(shù))。(2)C程序的執(zhí)行從主函數(shù)開始,如果在主函數(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ù)之間沒有從屬關(guān)系,互相獨(dú)立,不能嵌套定義。1、函數(shù)的概念
6.1函數(shù)的概念和模塊化程序設(shè)計(jì)從函數(shù)定義的角度劃分庫函數(shù)(又稱標(biāo)準(zhǔn)庫函數(shù)):由C語言的函數(shù)庫提供,即C語言自身已經(jīng)定義好的函數(shù),在包含相應(yīng)頭文件后用戶可以直接使用;用戶函數(shù)(又稱自定義函數(shù)):是用戶根據(jù)需要自行定義的完成某一特定功能的一段程序。從函數(shù)有無參數(shù)的角度劃分有參函數(shù):定義函數(shù)時(shí)有參數(shù)的稱為有參函數(shù);無參函數(shù):定義函數(shù)時(shí)無參數(shù)的稱為無參函數(shù)。1、函數(shù)的概念
6.1函數(shù)的概念和模塊化程序設(shè)計(jì)從函數(shù)有無返回值的角度劃分有返回值函數(shù):調(diào)用后返回一個(gè)值;無返回值函數(shù):調(diào)用后不返回值。從函數(shù)作用范圍的角度劃分C語言允許將一個(gè)源程序分放在不同的程序文件中,采用分塊編譯、連接生成一個(gè)目標(biāo)程序,其中每個(gè)程序文件稱為一個(gè)“編譯單元”。每個(gè)編譯單元可以包含若干個(gè)函數(shù)。外部函數(shù):可以被任何編譯單元調(diào)用的;內(nèi)部函數(shù):只能在本編譯單元中被調(diào)用。1、函數(shù)的概念
6.1函數(shù)的概念和模塊化程序設(shè)計(jì)函數(shù)定義的一般形式數(shù)據(jù)類型符函數(shù)名(形式參數(shù)表){數(shù)據(jù)定義語句部分;執(zhí)行語句部分;}函數(shù)首部(函數(shù)頭)函數(shù)體
例:兩個(gè)數(shù)之和的函數(shù)。doubleadd(doublex,doubley){
doublez;z=x+y;
returnz;
}函數(shù)體:{}中的內(nèi)容,包括說明語句和執(zhí)行語句。空函數(shù):函數(shù)體為空的函數(shù),例{},便于擴(kuò)充和細(xì)化程序。說明(1)任何函數(shù)(包括主函數(shù))都是由函數(shù)首部和函數(shù)體兩部分組成。(2)函數(shù)首部末尾不能加分號。(3)“函數(shù)名”是一個(gè)標(biāo)識符,在同一個(gè)編譯單元中函數(shù)不能重名。(4)C語言中,所有函數(shù)(包括主函數(shù))都是平行的。一個(gè)函數(shù)的定義,可以放在程序中的任意位置,主函數(shù)之前或之后。但是在一個(gè)函數(shù)的函數(shù)體內(nèi)不能再定義另一個(gè)函數(shù),即不允許函數(shù)的嵌套定義。2、函數(shù)的定義6.1函數(shù)的概念和模塊化程序設(shè)計(jì)
無參函數(shù)定義格式
數(shù)據(jù)類型符或void函數(shù)名(void){數(shù)據(jù)定義語句部分;執(zhí)行語句部分;}
有參函數(shù)定義格式
數(shù)據(jù)類型符或void函數(shù)名(形式參數(shù)表){定義語句部分;執(zhí)行語句部分;}2、函數(shù)的定義6.1函數(shù)的概念和模塊化程序設(shè)計(jì)
無返回值函數(shù)定義格式
void函數(shù)名(形式參數(shù)表或void)
{數(shù)據(jù)定義語句部分;執(zhí)行語句部分;
}
有返回值函數(shù)定義格式數(shù)據(jù)類型符函數(shù)名(形式參數(shù)表或void)
{定義語句部分;執(zhí)行語句部分;}2、函數(shù)的定義6.1函數(shù)的概念和模塊化程序設(shè)計(jì)C程序是通過對函數(shù)的調(diào)用來執(zhí)行函數(shù)體。被調(diào)函數(shù)應(yīng)該先定義,后調(diào)用。格式
函數(shù)名([實(shí)際參數(shù)表]);調(diào)用方式
(1)以函數(shù)語句的方式
函數(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】編寫一個(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ù)(簡稱形參):是在函數(shù)定義中設(shè)置的,用來接收從主調(diào)函數(shù)傳來的對應(yīng)實(shí)參的數(shù)據(jù)。實(shí)際參數(shù)(簡稱實(shí)參):是調(diào)用函數(shù)時(shí)的實(shí)際參數(shù),實(shí)參可以是常量、變量或表達(dá)式,也可以是函數(shù)的返回值,無論哪種形式必須有確定的值。注意(1)形參在調(diào)用時(shí)才被分配內(nèi)存空間,調(diào)用結(jié)束后釋放。(2)實(shí)參可以是常量、變量或表達(dá)式,但要求有確定值。(3)實(shí)參在數(shù)量、類型和順序上與形參必須一一對應(yīng)和匹配。如果參數(shù)的數(shù)量不一致,則會出現(xiàn)編譯錯(cuò)誤;如果參數(shù)的順序不一致,則傳遞到被調(diào)函數(shù)中的數(shù)據(jù)不合邏輯;如果參數(shù)的類型不一致,則按照形參類型對實(shí)參進(jìn)行自動(dòng)轉(zhuǎn)換,如果是不能進(jìn)行轉(zhuǎn)換的類型,則出現(xiàn)編譯錯(cuò)誤。(4)實(shí)參向形參的單向傳遞,“值傳遞”,即只由實(shí)參傳給形參,而不能由形參傳回給實(shí)參。3、函數(shù)的調(diào)用6.1函數(shù)的概念和模塊化程序設(shè)計(jì)返回值類型函數(shù)返回值的類型即函數(shù)類型,是指返回給主調(diào)函數(shù)的結(jié)果的類型,應(yīng)根據(jù)具體函數(shù)的功能確定。如果函數(shù)不返回任何值,則函數(shù)返回值類型定義為“void”,稱為“空類型”。有參函數(shù)的返回值,是通過函數(shù)中的return語句獲得。return語句功能:返回調(diào)用函數(shù),并將“返回值表達(dá)式”的值帶給調(diào)用函數(shù)。使用方式(1)無返回值的函數(shù)return;(2)有返回值的函數(shù)return(返回值表達(dá)式);或return返回值表達(dá)式;4、函數(shù)的返回6.1函數(shù)的概念和模塊化程序設(shè)計(jì)說明(1)一個(gè)函數(shù)中可以有多個(gè)return語句
(2)若無return語句,則執(zhí)行到函數(shù)體末尾后,并不是不返回一個(gè)值,而是返回一個(gè)不確定的值。
(3)若無值返回,則函數(shù)應(yīng)定義為void類型。
(4)return語句中表達(dá)式的類型與函數(shù)類型一致。若不一致,以函數(shù)值類型為準(zhǔn)。4、函數(shù)的返回6.1函數(shù)的概念和模塊化程序設(shè)計(jì)(1)暫停執(zhí)行函數(shù)調(diào)用所在的語句,轉(zhuǎn)向執(zhí)行被調(diào)函數(shù)。(2)為函數(shù)的所有形參分配內(nèi)存,再計(jì)算所有實(shí)參的值,依次賦予對應(yīng)的形參。若是無參函數(shù),則不執(zhí)行這一操作。(3)進(jìn)入函數(shù)體,先執(zhí)行數(shù)據(jù)定義語句部分,為函數(shù)體中定義的變量、數(shù)組等分配內(nèi)存。(4)執(zhí)行函數(shù)體中的執(zhí)行語句部分。如果是無返回值的函數(shù),則執(zhí)行到返回語句;如果返回語句被省略,則執(zhí)行到函數(shù)體的右花括號;如果是有返回值的函數(shù),則執(zhí)行到返回語句時(shí),計(jì)算表達(dá)式的值作為函數(shù)的返回值。(5)收回分配給函數(shù)體中定義的變量、數(shù)組、形參等的內(nèi)存單元。(6)返回到主調(diào)函數(shù)繼續(xù)執(zhí)行。如果函數(shù)調(diào)用的形式是“語句”,則執(zhí)行其后面的語句;如果函數(shù)調(diào)用的形式是“表達(dá)式”,則繼續(xù)執(zhí)行表達(dá)式所在的語句。5、函數(shù)的調(diào)用過程6.1函數(shù)的概念和模塊化程序設(shè)計(jì)C語言中,一個(gè)大的程序由許多源程序文件(又稱程序模塊,通常是一些相關(guān)函數(shù)的集合)組成,而源程序文件由預(yù)編譯和許多函數(shù)組成。C語言程序源文件(程序模塊)結(jié)構(gòu)包含文件,例如#include<stdio.h>宏定義,例如#definePI3.14159條件編譯,例如#if…#else…#endif函數(shù)聲明,例如定義函數(shù)的原型全局變量說明,例如函數(shù)外定義的變量函數(shù)定義源文件包含文件宏定義條件編譯函數(shù)預(yù)說明全局變量說明函數(shù)模塊定義函數(shù)模塊定義……大程序6、模塊化程序設(shè)計(jì)方法6.1函數(shù)的概念和模塊化程序設(shè)計(jì)在調(diào)用函數(shù)之前應(yīng)當(dāng)對調(diào)用的函數(shù)進(jìn)行聲明,讓編譯程序預(yù)先了解函數(shù)的有關(guān)信息。格式[存儲類型][數(shù)據(jù)類型符]函數(shù)名(形參類型[形參名1][,形參類型[形參名2],…]);說明(1)函數(shù)聲明是一條語句,末尾加分號;而函數(shù)首部不是語句,末尾不加分號。(2)函數(shù)聲明與函數(shù)定義是不同的。函數(shù)定義是編寫一段程序,除了指定函數(shù)名、返回值類型、形參名、形參類型外,還有函數(shù)體;而函數(shù)聲明只是把函數(shù)名、返回值類型、形參名、形參類型等通知編譯程序,以便在調(diào)用該函數(shù)時(shí)系統(tǒng)據(jù)此對照檢查,它沒有函數(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ù)所在編譯單元的開頭將被調(diào)函數(shù)進(jìn)行聲明:extern數(shù)據(jù)類型符函數(shù)名(形式參數(shù)表);;若主函數(shù)與被調(diào)函數(shù)在同一編譯單元中,則可以不說明其函數(shù)原型。同時(shí)C語言又規(guī)定,若被調(diào)函數(shù)的函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前,則在主調(diào)函數(shù)中可以省略對被調(diào)函數(shù)的聲明。因?yàn)樵谡{(diào)用之前,編譯程序已經(jīng)知道了被調(diào)函數(shù)的函數(shù)類型、參數(shù)個(gè)數(shù)、類型和順序等信息。除了上述兩種情況,都需要對被調(diào)函數(shù)進(jìn)行聲明。
6.2函數(shù)的聲明被調(diào)用函數(shù)若為系統(tǒng)函數(shù)(庫函數(shù)):除了少數(shù)庫函數(shù)(如scanf()、printf())外,都要求在本文件開頭用包含命令包含被調(diào)函數(shù)的信息。用戶函數(shù)函數(shù)聲明的幾種形式
數(shù)據(jù)類型符函數(shù)名(形參類型形參名1,形參類型形參名2,……);
數(shù)據(jù)類型符函數(shù)名(形參類型1,形參類型2,……);
數(shù)據(jù)類型符函數(shù)名();intmax(inta,intb);intmax(int,int);intmax();6.2函數(shù)的聲明說明(1)函數(shù)原型告訴編譯程序函數(shù)返回的數(shù)據(jù)類型、函數(shù)所要接收的參數(shù)個(gè)數(shù)、參數(shù)類型和參數(shù)順序,編譯程序利用函數(shù)原型校驗(yàn)函數(shù)調(diào)用是否正確。(2)函數(shù)原型中可以只說明形參類型和形參個(gè)數(shù),而無需說明形參名。例如,對函數(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)用會導(dǎo)致語法錯(cuò)誤;函數(shù)原型和函數(shù)定義不一致,也會產(chǎn)生錯(cuò)誤。6.2函數(shù)的聲明說明(4)函數(shù)原型可以在主調(diào)函數(shù)中聲明;也可以在所有函數(shù)的外部(如文件聲明處)進(jìn)行聲明。這種情況下,在該聲明之后定義的所有函數(shù)均可以調(diào)用該函數(shù),而不必再聲明。(5)如果程序中沒有包含函數(shù)原型,則編譯程序會用第一次出現(xiàn)的該函數(shù)(函數(shù)定義或函數(shù)原型)來構(gòu)造函數(shù)原型。6.2函數(shù)的聲明函數(shù)之間數(shù)據(jù)傳遞方式值傳遞地址傳遞返回值全局變量傳遞前兩種方式是利用定義函數(shù)時(shí)設(shè)置的形參和調(diào)用函數(shù)時(shí)給出的實(shí)參來傳遞數(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ù)組的類型和函數(shù)形參的類型一致即可,并不要求函數(shù)的形參也是下標(biāo)變量。換言之,對數(shù)組元素的處理是按普通變量對待的。普通變量或下標(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í),要求形參和相對應(yīng)的實(shí)參都必須是類型相同的數(shù)組(或指向數(shù)組的指針變量),都必須有明確的數(shù)組說明。如果形參是數(shù)組名,則傳遞方式稱為“地址傳遞方式”
2、數(shù)組作為函數(shù)參數(shù)的數(shù)據(jù)傳遞方式6.3函數(shù)的參數(shù)和數(shù)據(jù)傳遞方式當(dāng)一維數(shù)組名做形參時(shí)可以指定數(shù)組的長度,也可以不指定數(shù)組的長度,而只在數(shù)組名后面跟一對空的方括號。當(dāng)多維數(shù)組名做實(shí)參和形參時(shí),形參數(shù)組可以省略第一維的長度說明,但第二維及以上的長度說明不能省略。
不是在形參和實(shí)參之間進(jìn)行數(shù)據(jù)傳遞,而是通過函數(shù)調(diào)用直接返回一個(gè)值到主調(diào)函數(shù)。因此,這種方式通常用于從被調(diào)函數(shù)向主調(diào)函數(shù)回傳值。注意(1)函數(shù)首部中需要有“數(shù)據(jù)類型符”,說明該函數(shù)返回值的數(shù)據(jù)類型。(2)函數(shù)體中需要有語句“return(表達(dá)式);”,其中的表達(dá)式即是函數(shù)的返回值。3、利用返回值的數(shù)據(jù)傳遞方式6.3函數(shù)的參數(shù)和數(shù)據(jù)傳遞方式變量存儲類型自動(dòng)型(auto)寄存器型(register)外部型(extern)靜態(tài)型(static)變量存儲方式靜態(tài)存儲方式在編譯時(shí)由系統(tǒng)分配固定的存儲空間,直到程序運(yùn)行結(jié)束后才釋放所占用的存儲空間。動(dòng)態(tài)存儲方式在程序運(yùn)行時(shí)根據(jù)需要?jiǎng)討B(tài)地分配和釋放存儲空間。自動(dòng)型和寄存型器變量屬于動(dòng)態(tài)存儲方式,外部型和靜態(tài)型變量屬于靜態(tài)存儲方式。1、變量的存儲類型6.4變量的存儲類型和作用域自動(dòng)型變量
定義格式
[auto]數(shù)據(jù)類型變量表;
說明
(1)自動(dòng)變量屬于動(dòng)態(tài)存儲方式。在函數(shù)中定義的自動(dòng)變量,只在該函數(shù)內(nèi)有效;函數(shù)被調(diào)用時(shí)分配存儲空間,調(diào)用結(jié)束就釋放。在復(fù)合語句中定義的自動(dòng)變量,只在該復(fù)合語句中有效;退出復(fù)合語句后,也不能再使用,否則將引起錯(cuò)誤。(2)定義時(shí)如果沒有初始化,則其值是不確定的。如果初始化,則賦初值操作是在調(diào)用時(shí)進(jìn)行的,且每次調(diào)用都要重新賦一次初值。(3)由于自動(dòng)變量的作用域和生存期,都局限于定義它的個(gè)體內(nèi)(函數(shù)或復(fù)合語句),因此不同的個(gè)體中允許使用同名的變量而不會混淆。即使在函數(shù)內(nèi)定義的自動(dòng)變量,也可與該函數(shù)內(nèi)部的復(fù)合語句中定義的自動(dòng)變量同名。建議:系統(tǒng)不會混淆,并不意味著人也不會混淆,所以盡量少用同名自動(dòng)型變量!1、變量的存儲類型6.4變量的存儲類型和作用域靜態(tài)型變量定義格式
static數(shù)據(jù)類型變量表;
說明(1)靜態(tài)內(nèi)部變量屬于靜態(tài)存儲。在程序執(zhí)行過程中,即使所在函數(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、變量的存儲類型6.4變量的存儲類型和作用域寄存器型變量一般情況下,變量的值都是存儲在內(nèi)存。為提高執(zhí)行效率,C語言允許將局部變量的值存放到寄存器,這種變量稱為寄存器變量。
定義格式register數(shù)據(jù)類型變量表;
說明(1)只有局部變量才能定義為寄存器變量,全局變量不行。(2)對寄存器變量的實(shí)際處理,隨系統(tǒng)而異。例如,微機(jī)上的MSC和TC將寄存器變量實(shí)際當(dāng)作自動(dòng)變量處理。(3)允許使用的寄存器數(shù)目是有限的,不能定義任意多個(gè)寄存器變量。1、變量的存儲類型6.4變量的存儲類型和作用域外部型變量定義格式
extern數(shù)據(jù)類型外部變量表;
說明:外部型變量是專門用于在多個(gè)編譯單元之間傳遞數(shù)據(jù)的。當(dāng)編譯單元A需要使用在編譯單元B中定義的變量,則編譯單元A需要將該變量聲明為外部型變量,以便C編譯系統(tǒng)在編譯單元A之外的其它編譯單元中尋找該變量的定義,而在編譯單元B中需要定義該變量的存儲類型和數(shù)據(jù)類型。關(guān)鍵字extern與auto、static和register的用法不同,后三個(gè)關(guān)鍵字是在定義變量時(shí)加關(guān)鍵字,而extern是對已經(jīng)定義的全局變量進(jìn)行聲明。注意:函數(shù)內(nèi)的extern變量說明,表示引用本源文件中的外部變量;函數(shù)外(通常在文件開頭)的extern變量說明,表示引用其它文件中的外部變量。1、變量的存儲類型6.4變量的存儲類型和作用域變量的生存期從系統(tǒng)為變量分配內(nèi)存單元(或寄存器)開始到系統(tǒng)收回內(nèi)存單元(或寄存器)的期間稱為“變量的生存期”。在變量的生存期以外使用該變量會導(dǎo)致編譯錯(cuò)誤。變量的作用域C語言中所有的變量都有其作用域。變量說明的位置不同,其作用域也不同。2、變量的生存期和作用域6.4變量的存儲類型和作用域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()中*/說明(1)主函數(shù)中定義的內(nèi)部變量,也只能在主函數(shù)中使用,其它函數(shù)不能使用。同時(shí),主函數(shù)中也不能使用其它函數(shù)中定義的內(nèi)部變量。因?yàn)橹骱瘮?shù)也是一個(gè)函數(shù),與其它函數(shù)是平行關(guān)系。這一點(diǎn)是與其它語言不同的,應(yīng)予以注意。(2)形參變量也是內(nèi)部變量,屬于被調(diào)用函數(shù);實(shí)參變量,則是調(diào)用函數(shù)的內(nèi)部變量。(3)允許在不同的函數(shù)中使用相同的變量名,它們代表不同的對象,分配不同的單元,互不干擾,也不會發(fā)生混淆。(4)在復(fù)合語句中也可定義變量,其作用域只在復(fù)合語句范圍內(nèi)。2、變量的生存期和作用域6.4變量的存儲類型和作用域全局變量
定義:生存期覆蓋了定義點(diǎn)到整個(gè)程序結(jié)束的變量。局部變量定義:生存期只覆蓋了某個(gè)函數(shù)(或復(fù)合語句)的變量。對于局部變量,聲明存儲類型的作用是指定變量的存儲位置(靜態(tài)存儲區(qū)或動(dòng)態(tài)存儲區(qū))和生存期;對于全局變量,聲明存儲類型的作用是擴(kuò)展或限制變量的作用域。2、變量的生存期和作用域6.4變量的存儲類型和作用域內(nèi)部變量
定義:在一個(gè)函數(shù)(或復(fù)合語句)內(nèi)部定義的變量。作用域:該函數(shù)(或復(fù)合語句)范圍內(nèi)有效,即只在包含變量定義的函數(shù)(或復(fù)合語句)內(nèi)部,才能使用該變量,在此函數(shù)(或復(fù)合語句)之外則不能使用。說明(1)主函數(shù)中定義的內(nèi)部變量,只能在主函數(shù)中使用,其它函數(shù)不能使用。同時(shí),主函數(shù)中也不能使用其它函數(shù)中定義的內(nèi)部變量。因?yàn)橹骱瘮?shù)也是一個(gè)函數(shù),與其它函數(shù)是平行關(guān)系。這一點(diǎn)是與其它高級語言不同。(2)形參變量也是內(nèi)部變量,僅限于函數(shù)內(nèi)使用。(3)允許在不同函數(shù)中使用重名的變量,它們代表不同的對象,分配不同的內(nèi)存單元,互不干擾,也不會發(fā)生混淆。2、變量的生存期和作用域6.4變量的存儲類型和作用域說明(4)復(fù)合語句中也可定義變量,所定義的變量是內(nèi)部變量,其作用域只在該復(fù)合語句范圍內(nèi)。例如,
if(i>j) {
int
k; k=i;i=j;j=k;k有效 }
2、變量的生存期和作用域6.4變量的存儲類型和作用域外部變量定義:在函數(shù)外部定義的變量。作用域:從定義位置開始到本文件結(jié)束為止。它不屬于任何一個(gè)函數(shù),可被作用域內(nèi)的所有函數(shù)直接引用。說明(1)外部變量可以加強(qiáng)函數(shù)模塊之間的數(shù)據(jù)聯(lián)系,但又使這些函數(shù)依賴這些外部變量,因而使得這些函數(shù)的獨(dú)立性降低。從模塊化程序設(shè)計(jì)的觀點(diǎn)來看這是不利的,因此不是非用不可時(shí),不建議使用外部變量。(2)在同一源程序文件中,允許外部變量和內(nèi)部變量重名。如果外部變量和內(nèi)部變量重名,則在內(nèi)部變量的作用域內(nèi),外部變量將被屏蔽而不起作用。2、變量的生存期和作用域6.4變量的存儲類型和作用域說明(3)外部變量的作用域是從定義點(diǎn)到本文件結(jié)束。如果定義點(diǎn)之前的函數(shù)需要使用這些外部變量時(shí),需要在函數(shù)內(nèi)對被使用的外部變量進(jìn)行說明。外部變量說明的一般形式為:extern數(shù)據(jù)類型外部變量1[,外部變量2……];注意:外部變量的定義和外部變量的說明不同。外部變量的定義,必須在所有的函數(shù)之外,且只能定義一次。而外部變量的說明,出現(xiàn)在需要使用該全局變量的函數(shù)內(nèi),而且可以出現(xiàn)多次。2、變量的生存期和作用域6.4變量的存儲類型和作用域靜態(tài)局部變量和靜態(tài)外部變量同屬靜態(tài)存儲方式,區(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ù)”初始化問題,其當(dāng)前值由最近1次給它賦值的操作決定。
2、變量的生存期和作用域6.4變量的存儲類型和作用域務(wù)必牢記:把局部變量改變?yōu)殪o態(tài)內(nèi)部變量后,改變了它的存儲方式,即改變了它的生存期。把外部變量改變?yōu)殪o態(tài)外部變量后,改變了它的作用域,限制了它的使用范圍。因此,關(guān)鍵字“static”在不同的地方所起的作用是不同的。2、變量的生存期和作用域6.4變量的存儲類型和作用域不是在形參和實(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變量的存儲類型和作用域遞歸函數(shù):又稱自調(diào)用函數(shù),簡潔但不一定高效。三個(gè)條件:(1)遞歸問題的規(guī)律;
(2)通過轉(zhuǎ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ù)。這與其它語言的子程序嵌套調(diào)用的情形類似。main()函數(shù)①調(diào)用f1()函數(shù):結(jié)
束f1()函數(shù)調(diào)用f2()函數(shù):后續(xù)語句:后續(xù)語句:返
回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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度黑龍江省高校教師資格證之高等教育法規(guī)押題練習(xí)試題B卷含答案
- 消防設(shè)施操作員綜合復(fù)習(xí)試題及答案
- 語文學(xué)習(xí)的歷史與未來發(fā)展趨勢試題及答案
- 柑橘栽培新技術(shù)培訓(xùn)經(jīng)典
- 新課標(biāo)匯報(bào)課件模板范文
- 教育幫扶課件模板范文
- 2025年住宅房屋買賣協(xié)議標(biāo)準(zhǔn)版
- 精煉技巧:CPSM考試試題及答案
- 江蘇省高郵市2024-2025學(xué)年高三下學(xué)期第一次聯(lián)考數(shù)學(xué)試題含答案
- 2025年度模特經(jīng)紀(jì)公司藝人合約管理與培訓(xùn)協(xié)議
- 畢業(yè)設(shè)計(jì)振動(dòng)篩式花生收獲機(jī)
- 大數(shù)據(jù)可視化知到章節(jié)答案智慧樹2023年浙江大學(xué)
- 2023年(第九屆)全國大學(xué)生統(tǒng)計(jì)建模大賽 論文模板及說明
- 大學(xué)成績單(大專)
- 齲病的治療 深齲的治療
- 微山湖風(fēng)景區(qū)進(jìn)行旅游項(xiàng)目策劃方案
- JJF 1367-2012烘干法水分測定儀型式評價(jià)大綱
- 醫(yī)院麻醉藥品、精神藥品考試試題及答案
- GB/T 31586.1-2015防護(hù)涂料體系對鋼結(jié)構(gòu)的防腐蝕保護(hù)涂層附著力/內(nèi)聚力(破壞強(qiáng)度)的評定和驗(yàn)收準(zhǔn)則第1部分:拉開法試驗(yàn)
- GB/T 18337.3-2001生態(tài)公益林建設(shè)技術(shù)規(guī)程
- 增量房交易稅收申報(bào)表
評論
0/150
提交評論