第四章 函數(shù)-94_第1頁(yè)
第四章 函數(shù)-94_第2頁(yè)
第四章 函數(shù)-94_第3頁(yè)
第四章 函數(shù)-94_第4頁(yè)
第四章 函數(shù)-94_第5頁(yè)
已閱讀5頁(yè),還剩89頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、 在結(jié)構(gòu)化程序設(shè)計(jì)中,函數(shù)是將任務(wù)進(jìn)行模塊劃分的基在結(jié)構(gòu)化程序設(shè)計(jì)中,函數(shù)是將任務(wù)進(jìn)行模塊劃分的基 本單位。本單位。 在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,對(duì)數(shù)據(jù)的操作總是封裝在在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,對(duì)數(shù)據(jù)的操作總是封裝在 函數(shù)中,一個(gè)函數(shù)描述一種操作。不要完全按模塊思想講函數(shù)中,一個(gè)函數(shù)描述一種操作。不要完全按模塊思想講 。也是讓學(xué)生處于面向?qū)ο蟪绦蛟O(shè)計(jì)的氛圍中。這樣第。也是讓學(xué)生處于面向?qū)ο蟪绦蛟O(shè)計(jì)的氛圍中。這樣第5 5章章 的教學(xué)會(huì)順利一些。的教學(xué)會(huì)順利一些。 要掌握函數(shù)的使用,必須理解函數(shù)調(diào)用時(shí)的內(nèi)部實(shí)現(xiàn)機(jī)要掌握函數(shù)的使用,必須理解函數(shù)調(diào)用時(shí)的內(nèi)部實(shí)現(xiàn)機(jī) 制,以及與此相關(guān)的內(nèi)存分配機(jī)制、變量生命期

2、和作用域。制,以及與此相關(guān)的內(nèi)存分配機(jī)制、變量生命期和作用域。 本章還將介紹關(guān)于函數(shù)重載的概念,介紹遞歸算法本章還將介紹關(guān)于函數(shù)重載的概念,介紹遞歸算法 、內(nèi)聯(lián)函數(shù)、默認(rèn)參數(shù)函數(shù)以及多文件組織、編譯預(yù)處、內(nèi)聯(lián)函數(shù)、默認(rèn)參數(shù)函數(shù)以及多文件組織、編譯預(yù)處 理、工程文件的概念和運(yùn)行庫(kù)函數(shù)。理、工程文件的概念和運(yùn)行庫(kù)函數(shù)。 41 函數(shù)的定義與調(diào)用函數(shù)的定義與調(diào)用 4 5 作用域與存儲(chǔ)類型作用域與存儲(chǔ)類型 44 函數(shù)調(diào)用機(jī)制函數(shù)調(diào)用機(jī)制 43 全局變量和局部變量全局變量和局部變量 42 函數(shù)的參數(shù)傳遞函數(shù)的參數(shù)傳遞, 返回值及函數(shù)原型說(shuō)明返回值及函數(shù)原型說(shuō)明 410 編譯預(yù)處理編譯預(yù)處理 4 9 頭文件

3、與多文件結(jié)構(gòu)頭文件與多文件結(jié)構(gòu) 4 8 C+的系統(tǒng)庫(kù)函數(shù)的系統(tǒng)庫(kù)函數(shù) 4 7 函數(shù)的一些高級(jí)議題函數(shù)的一些高級(jí)議題 4 6 函數(shù)的遞歸調(diào)用函數(shù)的遞歸調(diào)用 4.1.1 函數(shù)概述函數(shù)概述 4.1.2 函數(shù)的定義函數(shù)的定義 4.1.3 函數(shù)的調(diào)用函數(shù)的調(diào)用 函數(shù)是函數(shù)是C+C+程序的基本組成模塊。程序的基本組成模塊。 通過(guò)函數(shù),可以把一個(gè)復(fù)雜任務(wù)分解成為若干通過(guò)函數(shù),可以把一個(gè)復(fù)雜任務(wù)分解成為若干 個(gè)易于解決的小任務(wù)。充分體現(xiàn)結(jié)構(gòu)化程序設(shè)計(jì)由個(gè)易于解決的小任務(wù)。充分體現(xiàn)結(jié)構(gòu)化程序設(shè)計(jì)由 粗到精,逐步細(xì)化的設(shè)計(jì)思想。粗到精,逐步細(xì)化的設(shè)計(jì)思想。 組成組成C+C+程序的若干函數(shù)中,有一個(gè)稱為程序的若干函

4、數(shù)中,有一個(gè)稱為main()main() (WinmainWinmain()())函數(shù),是程序執(zhí)行的入口,它可以調(diào))函數(shù),是程序執(zhí)行的入口,它可以調(diào) 用其他函數(shù)。而其他一般函數(shù)既可以調(diào)用也可以被調(diào)用其他函數(shù)。而其他一般函數(shù)既可以調(diào)用也可以被調(diào) 用。函數(shù)之間的調(diào)用關(guān)系見(jiàn)下圖:用。函數(shù)之間的調(diào)用關(guān)系見(jiàn)下圖: main ( ) fun2( )fun1( )fun3( ) fun1_1( )fun2_1( )fun2_2( ) 圖圖4.1 4.1 函數(shù)調(diào)用層次關(guān)系函數(shù)調(diào)用層次關(guān)系 函數(shù)函數(shù)按是否帶有參數(shù),分為按是否帶有參數(shù),分為: : 無(wú)參函數(shù)無(wú)參函數(shù)和和有參函數(shù)有參函數(shù) 4.1.1 結(jié)束結(jié)束 函數(shù)按

5、其是否系統(tǒng)預(yù)定義分為兩類:函數(shù)按其是否系統(tǒng)預(yù)定義分為兩類: 一類是編譯系統(tǒng)預(yù)定義的,稱為一類是編譯系統(tǒng)預(yù)定義的,稱為庫(kù)函數(shù)庫(kù)函數(shù)或或標(biāo)準(zhǔn)函數(shù)標(biāo)準(zhǔn)函數(shù), 如一些常用的數(shù)學(xué)計(jì)算函數(shù)、字符串處理函數(shù)、圖如一些常用的數(shù)學(xué)計(jì)算函數(shù)、字符串處理函數(shù)、圖 形處理函數(shù)、標(biāo)準(zhǔn)輸入輸出函數(shù)等。這些形處理函數(shù)、標(biāo)準(zhǔn)輸入輸出函數(shù)等。這些庫(kù)函數(shù)都庫(kù)函數(shù)都 按功能分類,集中說(shuō)明在不同的頭文件中按功能分類,集中說(shuō)明在不同的頭文件中。用戶只。用戶只 需在自己的程序中包含某個(gè)頭文件,就可直接使用需在自己的程序中包含某個(gè)頭文件,就可直接使用 該文件中定義的函數(shù)。該文件中定義的函數(shù)。 另一類是用戶另一類是用戶自定義函數(shù)自定義函數(shù),

6、用戶可以根據(jù)需要將某,用戶可以根據(jù)需要將某 個(gè)具有相對(duì)獨(dú)立功能的程序定義為函數(shù)。個(gè)具有相對(duì)獨(dú)立功能的程序定義為函數(shù)。 1. 無(wú)參函數(shù)無(wú)參函數(shù) 2. 有參函數(shù)有參函數(shù) 定義格式為:定義格式為: 數(shù)據(jù)類型數(shù)據(jù)類型函數(shù)名函數(shù)名( (voidvoid)函數(shù)體函數(shù)體 例例: 下面函數(shù)的功能是打印一個(gè)表頭下面函數(shù)的功能是打印一個(gè)表頭 void TableHead ( ) cout*endl; cout* example *endl; cout*=b?a:b); 定義函數(shù)時(shí)可能會(huì)涉及若干個(gè)變量,究竟哪些變量應(yīng)當(dāng)定義函數(shù)時(shí)可能會(huì)涉及若干個(gè)變量,究竟哪些變量應(yīng)當(dāng) 作為函數(shù)的參數(shù)?哪些應(yīng)當(dāng)定義在函數(shù)體內(nèi)?這有一個(gè)

7、原則:作為函數(shù)的參數(shù)?哪些應(yīng)當(dāng)定義在函數(shù)體內(nèi)?這有一個(gè)原則: 作為一個(gè)相對(duì)獨(dú)立的模塊,作為一個(gè)相對(duì)獨(dú)立的模塊,函數(shù)在使用時(shí)完全可以被看成函數(shù)在使用時(shí)完全可以被看成 “黑匣子黑匣子”,除了輸入輸出外,其他部分可不必關(guān)心,除了輸入輸出外,其他部分可不必關(guān)心。從函。從函 數(shù)的定義看出,函數(shù)頭正是用來(lái)反映函數(shù)的功能和使用接口,數(shù)的定義看出,函數(shù)頭正是用來(lái)反映函數(shù)的功能和使用接口, 它所定義的是它所定義的是“做什么做什么”,在這部分必須明確,在這部分必須明確“黑匣子黑匣子”的的 輸入輸出部分,輸入輸出部分,輸出就是函數(shù)的返回值,輸入就是參數(shù)輸出就是函數(shù)的返回值,輸入就是參數(shù)。因。因 此,只有那些功能上起

8、自變量作用的變量才必須作為參數(shù)定此,只有那些功能上起自變量作用的變量才必須作為參數(shù)定 義在參數(shù)表中;函數(shù)體中具體描述義在參數(shù)表中;函數(shù)體中具體描述“如何做如何做”,因此除參數(shù),因此除參數(shù) 之外的為實(shí)現(xiàn)算法所需用的變量應(yīng)當(dāng)定義在函數(shù)體內(nèi)。之外的為實(shí)現(xiàn)算法所需用的變量應(yīng)當(dāng)定義在函數(shù)體內(nèi)。 C+C+中不允許函數(shù)的嵌套定義,即在一個(gè)函數(shù)中定義另一中不允許函數(shù)的嵌套定義,即在一個(gè)函數(shù)中定義另一 個(gè)函數(shù)。個(gè)函數(shù)。 在在C+C+中,除了主函數(shù)外,其他任何函數(shù)都不能單獨(dú)作為程中,除了主函數(shù)外,其他任何函數(shù)都不能單獨(dú)作為程 序運(yùn)行。任何函數(shù)功能的實(shí)現(xiàn)都是通過(guò)被主函數(shù)直接或間接序運(yùn)行。任何函數(shù)功能的實(shí)現(xiàn)都是通過(guò)被

9、主函數(shù)直接或間接 調(diào)用進(jìn)行的。所謂函數(shù)調(diào)用,就是使程序轉(zhuǎn)去執(zhí)行函數(shù)體。調(diào)用進(jìn)行的。所謂函數(shù)調(diào)用,就是使程序轉(zhuǎn)去執(zhí)行函數(shù)體。 無(wú)參函數(shù)的調(diào)用格式為:無(wú)參函數(shù)的調(diào)用格式為: 函數(shù)名函數(shù)名( )( ) 有參函數(shù)的調(diào)用格式為:有參函數(shù)的調(diào)用格式為: 函數(shù)名函數(shù)名( (實(shí)際參數(shù)表實(shí)際參數(shù)表) ) 其中實(shí)際參數(shù)簡(jiǎn)稱實(shí)參,用來(lái)將實(shí)際參數(shù)的值傳遞給形參,其中實(shí)際參數(shù)簡(jiǎn)稱實(shí)參,用來(lái)將實(shí)際參數(shù)的值傳遞給形參, 因此可以是常量、具有值的變量或表達(dá)式。因此可以是常量、具有值的變量或表達(dá)式。 main( ) 函數(shù)函數(shù) 調(diào)用調(diào)用 max(2.5,4.7 ) 函數(shù)函數(shù) max(2.5,4.7 ) return 4.7 主程

10、序后主程序后 續(xù)語(yǔ)句續(xù)語(yǔ)句 【例【例41】 輸入兩個(gè)實(shí)數(shù),輸出其中較大的數(shù)。其中求兩個(gè)實(shí)輸入兩個(gè)實(shí)數(shù),輸出其中較大的數(shù)。其中求兩個(gè)實(shí) 數(shù)中的較大數(shù)用函數(shù)完成。數(shù)中的較大數(shù)用函數(shù)完成。 程序如下程序如下: #include float max(float x,float y) return(x=y?x:y); void main() float x,y; cout輸入兩個(gè)實(shí)數(shù):輸入兩個(gè)實(shí)數(shù):xy; coutx和和y中較大數(shù)為中較大數(shù)為max(x,y)endl; 421 函數(shù)的參數(shù)傳遞及傳值調(diào)用函數(shù)的參數(shù)傳遞及傳值調(diào)用 423 函數(shù)原型說(shuō)明函數(shù)原型說(shuō)明 422 函數(shù)返回值函數(shù)返回值 函數(shù)調(diào)用首先要

11、進(jìn)行參數(shù)傳遞,參數(shù)傳遞的方向是由實(shí)參函數(shù)調(diào)用首先要進(jìn)行參數(shù)傳遞,參數(shù)傳遞的方向是由實(shí)參 傳遞給形參。傳遞過(guò)程是,傳遞給形參。傳遞過(guò)程是,先計(jì)算實(shí)參表達(dá)式的值,再將先計(jì)算實(shí)參表達(dá)式的值,再將 該值傳遞給對(duì)應(yīng)的形參變量該值傳遞給對(duì)應(yīng)的形參變量。一般情況下,。一般情況下,實(shí)參和形參的實(shí)參和形參的 個(gè)數(shù)和排列順序應(yīng)一一對(duì)應(yīng),并且對(duì)應(yīng)參數(shù)應(yīng)類型匹配個(gè)數(shù)和排列順序應(yīng)一一對(duì)應(yīng),并且對(duì)應(yīng)參數(shù)應(yīng)類型匹配 (賦值兼容)(賦值兼容), ,即實(shí)參的類型可以轉(zhuǎn)化為形參類型。而對(duì)即實(shí)參的類型可以轉(zhuǎn)化為形參類型。而對(duì) 應(yīng)參數(shù)的參數(shù)名則不要求相同。應(yīng)參數(shù)的參數(shù)名則不要求相同。 按照參數(shù)形式的不同,按照參數(shù)形式的不同,C+有兩

12、種調(diào)用方式:有兩種調(diào)用方式:傳值調(diào)用傳值調(diào)用 和和引用調(diào)用引用調(diào)用。顧名思義,傳值調(diào)用傳遞的是實(shí)參的值,。顧名思義,傳值調(diào)用傳遞的是實(shí)參的值, 本章主要介紹傳值調(diào)用。關(guān)于引用調(diào)用,將在第五章類本章主要介紹傳值調(diào)用。關(guān)于引用調(diào)用,將在第五章類 與對(duì)象中介紹。與對(duì)象中介紹。 調(diào)用調(diào)用 power(4.6,3 ) 函數(shù)函數(shù) power(4.6,3 ) return 97.336 主程序后續(xù)語(yǔ)主程序后續(xù)語(yǔ) 句句 n= 3 x= 4.6 c= a 【例【例42】 說(shuō)明實(shí)參和形參對(duì)應(yīng)關(guān)系的示例。說(shuō)明實(shí)參和形參對(duì)應(yīng)關(guān)系的示例。 #include #include float power(float x,in

13、t n) /求求x x的的n n次冪次冪 float pow=1; while(n-) pow*=x; return pow; void main() int n=3; float x=4.6; char c=a; coutpower(x,n)=power(x,n)endl; coutpower(c,n)=power(c,n)endl; coutpower(n,x)=power(n,x)endl; 調(diào)用調(diào)用 power(a,3 ) 函數(shù)函數(shù) power(a,3 ) return 912673 主程序后續(xù)語(yǔ)主程序后續(xù)語(yǔ) 句句 n= 3 x= 4.6 c= a 【例例42】 說(shuō)明實(shí)參和形參對(duì)應(yīng)關(guān)系

14、的示例。說(shuō)明實(shí)參和形參對(duì)應(yīng)關(guān)系的示例。 #include #include float power(float x,int n) /求求x x的的n n次冪次冪 float pow=1; while(n-) pow*=x; return pow; void main() int n=3; float x=4.6; char c=a; coutpower(x,n)=power(x,n)endl; coutpower(c,n)=power(c,n)endl; coutpower(n,x)=power(n,x)endl; 調(diào)用調(diào)用 power(3,4.6 ) 函數(shù)函數(shù) power(3,4.6 ) r

15、eturn 81 主程序后續(xù)語(yǔ)主程序后續(xù)語(yǔ) 句句 n= 3 x=4.6 c= a 【例例42】 說(shuō)明實(shí)參和形參對(duì)應(yīng)關(guān)系的示例。說(shuō)明實(shí)參和形參對(duì)應(yīng)關(guān)系的示例。 #include #include float power(float x,int n) /求求x x的的n n次冪次冪 float pow=1; while(n-) pow*=x; return pow; void main() int n=3; float x=4.6; char c=a; coutpower (x,n)=power(x,n)endl; coutpower (c,n)=power(c,n)endl; coutpower

16、 (n,x)=power(n,x)endl; return語(yǔ)句的一般格式為:語(yǔ)句的一般格式為: return 表達(dá)式;表達(dá)式; 函數(shù)的計(jì)算結(jié)果通過(guò)該語(yǔ)句傳遞回主調(diào)函數(shù)。函數(shù)的計(jì)算結(jié)果通過(guò)該語(yǔ)句傳遞回主調(diào)函數(shù)。 【例【例43】設(shè)計(jì)函數(shù),根據(jù)三角形的三邊長(zhǎng)求面積。如】設(shè)計(jì)函數(shù),根據(jù)三角形的三邊長(zhǎng)求面積。如 果不能構(gòu)成三角形,給出提示信息。果不能構(gòu)成三角形,給出提示信息。 分析:函數(shù)為計(jì)算三角形面積,一般三角形返回面積值,分析:函數(shù)為計(jì)算三角形面積,一般三角形返回面積值, 若不能構(gòu)成三角形則返回若不能構(gòu)成三角形則返回-1。設(shè)計(jì)一個(gè)主函數(shù)完成函數(shù)。設(shè)計(jì)一個(gè)主函數(shù)完成函數(shù) 測(cè)試。根據(jù)返回值情況輸出相應(yīng)結(jié)

17、果。測(cè)試。根據(jù)返回值情況輸出相應(yīng)結(jié)果。 程序見(jiàn)下頁(yè):程序見(jiàn)下頁(yè): #include #include float TriangleArea(float a, float b, float c) if (a+b=c)|(a+c=b)|(b+c=a) return - 1; float s; s=(a+b+c)/2; return sqrt(s*(s-a)*(s-b)*(s-c); void main() float a,b,c,area; cout輸入三角形三邊輸入三角形三邊a,b,c:abc; area=TriangleArea(a,b,c); if(area=-1) cout(a,b, c

18、)不能構(gòu)成三角形!不能構(gòu)成三角形!endl; else cout三角形三角形(a,b,c )面積為:面積為:areaendl; 函數(shù)可以有返回值,也可以沒(méi)有返回值。對(duì)函數(shù)可以有返回值,也可以沒(méi)有返回值。對(duì) 于沒(méi)有返回值的函數(shù),功能只是完成一定操作,應(yīng)于沒(méi)有返回值的函數(shù),功能只是完成一定操作,應(yīng) 將返回值類型定義為將返回值類型定義為void ,函數(shù)體內(nèi)可以沒(méi)有,函數(shù)體內(nèi)可以沒(méi)有 return語(yǔ)句,當(dāng)需要在程序指定位置退出時(shí),可語(yǔ)句,當(dāng)需要在程序指定位置退出時(shí),可 以在該處放置一個(gè):以在該處放置一個(gè): return ; 4.2.2 結(jié)束結(jié)束 函數(shù)原型是一條以分號(hào)結(jié)束的語(yǔ)句,實(shí)際上函數(shù)原型是一條以分

19、號(hào)結(jié)束的語(yǔ)句,實(shí)際上 就是所定義函數(shù)的函數(shù)頭,形如:就是所定義函數(shù)的函數(shù)頭,形如: 函數(shù)返回值類型函數(shù)返回值類型函數(shù)名函數(shù)名 ( (形參表形參表) ) 語(yǔ)法上對(duì)程序文件中函數(shù)的排列次序是沒(méi)有固定要求的,語(yǔ)法上對(duì)程序文件中函數(shù)的排列次序是沒(méi)有固定要求的, 只要滿足只要滿足先定義后使用先定義后使用即可。但從結(jié)構(gòu)化程序設(shè)計(jì)的角度,即可。但從結(jié)構(gòu)化程序設(shè)計(jì)的角度, 通常是先調(diào)用后定義。使用函數(shù)原型,則既符合由粗到精通常是先調(diào)用后定義。使用函數(shù)原型,則既符合由粗到精 的思維方式,又滿足了語(yǔ)法要求。的思維方式,又滿足了語(yǔ)法要求。 其中形參表可以逐個(gè)列出每個(gè)參數(shù)的類型和參數(shù)名,其中形參表可以逐個(gè)列出每個(gè)參數(shù)

20、的類型和參數(shù)名, 也可以列出每個(gè)形參的類型,也可以列出每個(gè)形參的類型,參數(shù)名可省略參數(shù)名可省略,各形參之間,各形參之間 以逗號(hào)分隔。函數(shù)原型和所定義的函數(shù)必須在返回值類型、以逗號(hào)分隔。函數(shù)原型和所定義的函數(shù)必須在返回值類型、 函數(shù)名、形參個(gè)數(shù)和類型及函數(shù)名、形參個(gè)數(shù)和類型及次序次序等方面完全對(duì)應(yīng)一致,否等方面完全對(duì)應(yīng)一致,否 則將導(dǎo)致編譯錯(cuò)誤。則將導(dǎo)致編譯錯(cuò)誤。 下面是一個(gè)使用結(jié)構(gòu)化程序設(shè)計(jì)思想開發(fā)的企業(yè)管理下面是一個(gè)使用結(jié)構(gòu)化程序設(shè)計(jì)思想開發(fā)的企業(yè)管理 報(bào)表程序的框架。它使用了函數(shù)原型說(shuō)明。報(bào)表程序的框架。它使用了函數(shù)原型說(shuō)明。 #include void menu_print(); voi

21、d account_report(); void engineering_report(); void marketing_report(); void main() int choice; do menu_print(); cinchoice; while(choice=4); switch(choice) case 1: account_report(); break; case 2: engineering_report(); break; case 3: marketing_report(); break; void menu_print() cout”系統(tǒng)功能:系統(tǒng)功能:”endl;

22、 cout”1 財(cái)務(wù)報(bào)表財(cái)務(wù)報(bào)表”endl; cout”2 工程報(bào)表工程報(bào)表”endl; cout”3 市場(chǎng)報(bào)表市場(chǎng)報(bào)表”endl; cout”選擇業(yè)務(wù)序號(hào):選擇業(yè)務(wù)序號(hào):”; void account_report() /生成財(cái)務(wù)報(bào)表生成財(cái)務(wù)報(bào)表 void engineering_report() /生成工程報(bào)表生成工程報(bào)表 void marketing_report() /生成市場(chǎng)報(bào)表;生成市場(chǎng)報(bào)表; 【例【例44】 輸出所有滿足下列條件的正整數(shù)輸出所有滿足下列條件的正整數(shù)m: 10m1000且且m、m2、m3均為回文數(shù)。均為回文數(shù)。 分析:分析:回文指左右對(duì)稱的序列。如回文指左右對(duì)稱的序

23、列。如121、353等就是回等就是回 文數(shù)。判斷整數(shù)是否回文數(shù)用函數(shù)實(shí)現(xiàn),其思想是將文數(shù)。判斷整數(shù)是否回文數(shù)用函數(shù)實(shí)現(xiàn),其思想是將 該數(shù)各位拆開后反向組成新的整數(shù),如果該整數(shù)與原該數(shù)各位拆開后反向組成新的整數(shù),如果該整數(shù)與原 數(shù)相等則為回文數(shù)。數(shù)相等則為回文數(shù)。 程序如下:程序如下: #include #include bool palindrome(int); /函數(shù)原型函數(shù)原型 void main() coutsetw(10)msetw(20)m*m“ setw(20)m*m*mendl; for(int m=11;m1000;m+) if(palindrome(m) for(intj=0

24、;ji;j+) n=n*10+digitj; return (n=m); m m*m m*m*m 11 121 1331 101 10201 1030301 111 12321 1367631 運(yùn)行結(jié)果:運(yùn)行結(jié)果: 堆區(qū)堆區(qū) ( (動(dòng)態(tài)數(shù)據(jù)動(dòng)態(tài)數(shù)據(jù)) ) 棧區(qū)(函數(shù)局部數(shù)據(jù))棧區(qū)(函數(shù)局部數(shù)據(jù)) (main()函數(shù)局部數(shù)據(jù))函數(shù)局部數(shù)據(jù)) 全局?jǐn)?shù)據(jù)區(qū)全局?jǐn)?shù)據(jù)區(qū)( (全局、靜態(tài)全局、靜態(tài)) ) 代碼區(qū)(程序代碼)代碼區(qū)(程序代碼) 操作系統(tǒng)為一個(gè)操作系統(tǒng)為一個(gè)C+C+程序的運(yùn)行所分配的內(nèi)程序的運(yùn)行所分配的內(nèi) 存分為四個(gè)區(qū)域,如圖存分為四個(gè)區(qū)域,如圖4.34.3 程序在內(nèi)存中的程序在內(nèi)存中的 區(qū)域

25、區(qū)域所示:所示: (1)代碼區(qū)()代碼區(qū)(Code area):存放程序代碼,):存放程序代碼, 即程序中各個(gè)函數(shù)的代碼塊;即程序中各個(gè)函數(shù)的代碼塊; (2)全局?jǐn)?shù)據(jù)區(qū)()全局?jǐn)?shù)據(jù)區(qū)(Data area):存放全局?jǐn)?shù)):存放全局?jǐn)?shù) 據(jù)和靜態(tài)數(shù)據(jù);分配該區(qū)時(shí)內(nèi)存全部清零。據(jù)和靜態(tài)數(shù)據(jù);分配該區(qū)時(shí)內(nèi)存全部清零。 (3)棧區(qū)()棧區(qū)(Stack area):存放局部變量,如):存放局部變量,如 函數(shù)中的變量等;分配棧區(qū)時(shí)內(nèi)存不處理。函數(shù)中的變量等;分配棧區(qū)時(shí)內(nèi)存不處理。 (4)堆區(qū)()堆區(qū)(Heap area):存放與指針相關(guān)的):存放與指針相關(guān)的 動(dòng)態(tài)數(shù)據(jù)。分配堆區(qū)時(shí)內(nèi)存不處理。參見(jiàn)第七動(dòng)態(tài)數(shù)據(jù)。

26、分配堆區(qū)時(shí)內(nèi)存不處理。參見(jiàn)第七 章。章。 在所有函數(shù)之外定義的變量稱為在所有函數(shù)之外定義的變量稱為全局變量全局變量。 全局變量在編譯時(shí)建立在全局?jǐn)?shù)據(jù)區(qū),在未給全局變量在編譯時(shí)建立在全局?jǐn)?shù)據(jù)區(qū),在未給 出初始化值時(shí)系統(tǒng)自動(dòng)出初始化值時(shí)系統(tǒng)自動(dòng)初始化為全初始化為全0。 全局變量可定義在程序開頭,也可定義在中間全局變量可定義在程序開頭,也可定義在中間 位置,該全局變量位置,該全局變量在定義處之后在定義處之后的任何位置都是可的任何位置都是可 以訪問(wèn)的,稱為可見(jiàn)的。以訪問(wèn)的,稱為可見(jiàn)的。 請(qǐng)看下例:請(qǐng)看下例: 打印打印 200 調(diào)用調(diào)用 func( ) 函數(shù)函數(shù) func( ) 200*2 =400 打

27、印打印 400 n=100 n=100*2 =200 【例【例4 45 5】 多個(gè)函數(shù)使用全局變量的例子。多個(gè)函數(shù)使用全局變量的例子。 #include int n=100; void func() n*=2; void main() n*=2; coutnendl; func(); coutnendl; 定義在函數(shù)內(nèi)或塊內(nèi)的變量稱為定義在函數(shù)內(nèi)或塊內(nèi)的變量稱為局部變量局部變量。 程序中使用的絕大多數(shù)變量都是局部變量。程序中使用的絕大多數(shù)變量都是局部變量。 局部變量在程序運(yùn)行到它所在的塊時(shí)建立在棧中,局部變量在程序運(yùn)行到它所在的塊時(shí)建立在棧中, 該塊執(zhí)行完畢局部變量占有的空間即被釋放。該塊執(zhí)行

28、完畢局部變量占有的空間即被釋放。 局部變量在定義時(shí)可加修飾詞局部變量在定義時(shí)可加修飾詞auto,但通常省略。但通常省略。 局部變量在定義時(shí)若未初始化,其值為隨機(jī)數(shù)。局部變量在定義時(shí)若未初始化,其值為隨機(jī)數(shù)。 打印打印main() 中的中的t=3.5 調(diào)用調(diào)用 fun( ) 函數(shù)函數(shù) fun( ) 打印打印fun() 中的中的t=5 打印打印main() 中的中的t=3.5 t= 3.5 t = 5 【例【例49】 使用局部變量的例子。使用局部變量的例子。 #include void fun() auto int t=5; / fun()中的局部變量,中的局部變量,auto可省略可省略 cout

29、fun()中的中的t=tendl; void main() float t=3.5; /main()函數(shù)中的局部變量函數(shù)中的局部變量 coutmain()中的中的t=tendl; fun(); coutmain()中的中的t=tendl; 局部變量占用的內(nèi)存是在程序執(zhí)行過(guò)程中局部變量占用的內(nèi)存是在程序執(zhí)行過(guò)程中“動(dòng)態(tài)動(dòng)態(tài)”地建立地建立 和釋放的。這種和釋放的。這種“動(dòng)態(tài)動(dòng)態(tài)”是通過(guò)棧由系統(tǒng)自動(dòng)管理進(jìn)行的。當(dāng)是通過(guò)棧由系統(tǒng)自動(dòng)管理進(jìn)行的。當(dāng) 任何一個(gè)函數(shù)調(diào)用發(fā)生時(shí),系統(tǒng)都要作以下工作:任何一個(gè)函數(shù)調(diào)用發(fā)生時(shí),系統(tǒng)都要作以下工作: (1)建立??臻g;)建立??臻g; (6)恢復(fù)現(xiàn)場(chǎng):取主調(diào)函數(shù)運(yùn)行狀

30、態(tài)及返回地址,釋放??臻g;)恢復(fù)現(xiàn)場(chǎng):取主調(diào)函數(shù)運(yùn)行狀態(tài)及返回地址,釋放??臻g; (7)繼續(xù)主調(diào)函數(shù)后續(xù)語(yǔ)句。)繼續(xù)主調(diào)函數(shù)后續(xù)語(yǔ)句。 (5)釋放被調(diào)函數(shù)中局部變量占用的??臻g;)釋放被調(diào)函數(shù)中局部變量占用的棧空間; (4)執(zhí)行被調(diào)函數(shù)函數(shù)體;)執(zhí)行被調(diào)函數(shù)函數(shù)體; (3)為被調(diào)函數(shù)中的局部變量分配空間,完成參數(shù)傳遞;)為被調(diào)函數(shù)中的局部變量分配空間,完成參數(shù)傳遞; (2)保護(hù)現(xiàn)場(chǎng):主調(diào)函數(shù)運(yùn)行狀態(tài)和返回地址入棧;)保護(hù)現(xiàn)場(chǎng):主調(diào)函數(shù)運(yùn)行狀態(tài)和返回地址入棧; void fun1(int, int); void fun2(float); void main() int x=1;y=2; fun1

31、(x, y); void fun1(int a,int b) float x=3; fun2(x); void fun2(float y) int x; x棧頂棧頂 棧底棧底 y3 fun2()fun1()運(yùn)行狀態(tài)及返回地址運(yùn)行狀態(tài)及返回地址 x3 b2 a1 fun1()main()運(yùn)行狀態(tài)及返回地址運(yùn)行狀態(tài)及返回地址 y2 x1 main()操作系統(tǒng)運(yùn)行狀態(tài)及返回地址操作系統(tǒng)運(yùn)行狀態(tài)及返回地址 此圖例說(shuō)明在程序執(zhí)行過(guò)程中怎樣通過(guò)棧此圖例說(shuō)明在程序執(zhí)行過(guò)程中怎樣通過(guò)?!皠?dòng)態(tài)動(dòng)態(tài)”地建立和地建立和 釋放局部變量占用的內(nèi)存的釋放局部變量占用的內(nèi)存的 4.5.1 作作 用用 域域 4.5.2 變量

32、的存儲(chǔ)類型變量的存儲(chǔ)類型 4.5.3外部存儲(chǔ)類型與靜態(tài)存儲(chǔ)類型外部存儲(chǔ)類型與靜態(tài)存儲(chǔ)類型 4.5.4 生命期與可見(jiàn)性生命期與可見(jiàn)性 1 塊作用域塊作用域 3 文件作用域文件作用域 2 函數(shù)原型作用域函數(shù)原型作用域 作用域作用域指標(biāo)識(shí)符能夠被使用的范圍。只有在作用指標(biāo)識(shí)符能夠被使用的范圍。只有在作用 域內(nèi)標(biāo)識(shí)符才可以被訪問(wèn)(稱為可見(jiàn))。域內(nèi)標(biāo)識(shí)符才可以被訪問(wèn)(稱為可見(jiàn))。 本節(jié)只討論本節(jié)只討論局部域局部域和文件域(全局域),其中局和文件域(全局域),其中局 部域包括部域包括塊域塊域和和函數(shù)原型域函數(shù)原型域。任何。任何標(biāo)識(shí)符標(biāo)識(shí)符作用域的起作用域的起 始點(diǎn)均為始點(diǎn)均為標(biāo)識(shí)符說(shuō)明標(biāo)識(shí)符說(shuō)明處。處。

33、下面分別介紹下面分別介紹: 參和函數(shù)體中定義的局部變量,作用域都在該函數(shù)內(nèi),參和函數(shù)體中定義的局部變量,作用域都在該函數(shù)內(nèi), 也稱作也稱作函數(shù)域函數(shù)域。 塊塊指一對(duì)大括號(hào)括起來(lái)的程序段。塊中定義的標(biāo)指一對(duì)大括號(hào)括起來(lái)的程序段。塊中定義的標(biāo) 識(shí)符,作用域在塊內(nèi)。識(shí)符,作用域在塊內(nèi)。 復(fù)合語(yǔ)句是一個(gè)塊。復(fù)合語(yǔ)句是一個(gè)塊。 函數(shù)也是一個(gè)塊。函數(shù)也是一個(gè)塊。 復(fù)合語(yǔ)句中定義的標(biāo)識(shí)符,復(fù)合語(yǔ)句中定義的標(biāo)識(shí)符, 作用域僅在該復(fù)合語(yǔ)句中。作用域僅在該復(fù)合語(yǔ)句中。 函數(shù)中定義的標(biāo)識(shí)符,包括形函數(shù)中定義的標(biāo)識(shí)符,包括形 a= 3 b= 53 5 a=3 b=5 a=5 b=3 【例【例47】 輸入兩數(shù),按從大到

34、小的順序保存,并輸出結(jié)果。輸入兩數(shù),按從大到小的順序保存,并輸出結(jié)果。 結(jié)果結(jié)果 棧棧 t = 3 #include void main() int a,b; /具有函數(shù)域具有函數(shù)域 cout輸入兩整數(shù):輸入兩整數(shù):ab; cout“a=atb=b=a) int t; /具有塊域具有塊域 t=a; a=b; b=t; /交換交換a,b的值的值 couta=atb=bendl; 【例【例48】設(shè)計(jì)函數(shù)完成兩數(shù)交換,用主函數(shù)進(jìn)行測(cè)試?!吭O(shè)計(jì)函數(shù)完成兩數(shù)交換,用主函數(shù)進(jìn)行測(cè)試。 #include void swap(int,int); void main() int a,b; /a,b作用域?yàn)樽饔糜?/p>

35、為main() cout輸入兩整數(shù):輸入兩整數(shù):ab; cout調(diào)用前:實(shí)參調(diào)用前:實(shí)參a=a, b=bendl; swap(a,b); /傳值傳值 cout調(diào)用后:實(shí)參調(diào)用后:實(shí)參a=a,b=bendl; void swap(int a,int b) /a,b作用域?yàn)樽饔糜驗(yàn)閟wap() cout調(diào)用中調(diào)用中endl; cout交換前:形參交換前:形參 a=“ a,b=bendl; int t; t=a; a=b; b=t;/交換交換swap()中的中的a,b的值的值 cout交換后:形參交換后:形參a=a,b=bendl; 由由VC+平臺(tái)運(yùn)行,結(jié)果如下:平臺(tái)運(yùn)行,結(jié)果如下: 輸入兩整數(shù):輸

36、入兩整數(shù): 3 5 調(diào)用前:實(shí)參調(diào)用前:實(shí)參a=3,b=5 調(diào)用中調(diào)用中 交換前:形參交換前:形參a=3,b=5 交換后:形參交換后:形參a=5,b=3 調(diào)用后:實(shí)參調(diào)用后:實(shí)參a=3,b=5 交換失敗交換失敗 局部變量具有局部作用域使得程序在不同塊中可以局部變量具有局部作用域使得程序在不同塊中可以 使用同名變量。這些同名變量各自在自己的作用域使用同名變量。這些同名變量各自在自己的作用域 中可見(jiàn),在其它地方不可見(jiàn)。中可見(jiàn),在其它地方不可見(jiàn)。 對(duì)于塊中對(duì)于塊中嵌套嵌套其它塊的情況,如果嵌套塊中有同其它塊的情況,如果嵌套塊中有同 名局部變量,服從局部?jī)?yōu)先原則,即在內(nèi)層塊中名局部變量,服從局部?jī)?yōu)先原

37、則,即在內(nèi)層塊中屏屏 蔽蔽外層塊中的同名變量,換句話說(shuō),內(nèi)層塊中局部外層塊中的同名變量,換句話說(shuō),內(nèi)層塊中局部 變量的作用域?yàn)閮?nèi)層塊;外層塊中局部變量的作用變量的作用域?yàn)閮?nèi)層塊;外層塊中局部變量的作用 域?yàn)橥鈱映グ兞康膬?nèi)層塊部分。域?yàn)橥鈱映グ兞康膬?nèi)層塊部分。 如果塊內(nèi)定義的局部變量與全局變量同名,塊內(nèi)仍如果塊內(nèi)定義的局部變量與全局變量同名,塊內(nèi)仍 然局部變量?jī)?yōu)先,但與塊作用域不同的是,在塊內(nèi)然局部變量?jī)?yōu)先,但與塊作用域不同的是,在塊內(nèi) 可以通過(guò)域運(yùn)算符可以通過(guò)域運(yùn)算符“:”訪問(wèn)同名的全局變量。訪問(wèn)同名的全局變量。 全局全局n= 100 100 200 300 內(nèi)內(nèi) i= 5

38、00 內(nèi)內(nèi) j= 600 內(nèi)內(nèi)n=500+600 =1100 1100 500 600 100 200+300=500 500 500 200 300 外部外部 i=200 外部外部 j=300 【例【例49】 顯示同名變量可見(jiàn)性。顯示同名變量可見(jiàn)性。 int n=100; #include void main() int i=200,j=300; cout ntitjendl; /內(nèi)部塊內(nèi)部塊 int i=500,j=600,n; n=i+j; cout ntitj endl; /輸出局部變量輸出局部變量n cout:nendl;/輸出全局變量輸出全局變量n n=i+j;/修改全局變量修改全

39、局變量 cout ntitj endl; 函數(shù)原型不是定義函數(shù),在作函函數(shù)原型不是定義函數(shù),在作函 數(shù)原型聲明時(shí),其中的形參作用域數(shù)原型聲明時(shí),其中的形參作用域 只在原型聲明中,即只在原型聲明中,即作用域結(jié)束于作用域結(jié)束于 右括號(hào)右括號(hào)。正是由于形參不能被程序。正是由于形參不能被程序 的其他地方引用,所以通常只要聲的其他地方引用,所以通常只要聲 明形參個(gè)數(shù)和類型,明形參個(gè)數(shù)和類型,形參名可省略形參名可省略。 文件作用域文件作用域也稱全局作用域。定義在所有函數(shù)之外的也稱全局作用域。定義在所有函數(shù)之外的 標(biāo)識(shí)符,具有文件作用域,作用域?yàn)閺亩x處到整個(gè)標(biāo)識(shí)符,具有文件作用域,作用域?yàn)閺亩x處到整個(gè)

40、源文件結(jié)束。文件中定義的全局變量和函數(shù)都具有文源文件結(jié)束。文件中定義的全局變量和函數(shù)都具有文 件作用域。件作用域。 如果某個(gè)文件中說(shuō)明了具有文件作用域的標(biāo)識(shí)符,該如果某個(gè)文件中說(shuō)明了具有文件作用域的標(biāo)識(shí)符,該 文件又被另一個(gè)文件包含,則該標(biāo)識(shí)符的作用域延伸文件又被另一個(gè)文件包含,則該標(biāo)識(shí)符的作用域延伸 到新的文件中。如到新的文件中。如cincin和和coutcout是在頭文件是在頭文件iostream.hiostream.h中說(shuō)中說(shuō) 明的具有文件作用域的標(biāo)識(shí)符,它們的作用域也延伸明的具有文件作用域的標(biāo)識(shí)符,它們的作用域也延伸 到嵌入到嵌入iostream.hiostream.h的文件中。的文件

41、中。 存儲(chǔ)類型決定了變量的存儲(chǔ)類型決定了變量的生命期生命期,變量生命期指從,變量生命期指從 獲得空間到空間釋放之間的時(shí)期。獲得空間到空間釋放之間的時(shí)期。 存儲(chǔ)類型的說(shuō)明符有四個(gè)存儲(chǔ)類型的說(shuō)明符有四個(gè):auto, register, static和和 extern。前兩者稱為自動(dòng)類型,后兩者分別為靜態(tài)和外。前兩者稱為自動(dòng)類型,后兩者分別為靜態(tài)和外 部類型。部類型。 本節(jié)重點(diǎn)掌握本節(jié)重點(diǎn)掌握static和和extern這兩種類型的使用和這兩種類型的使用和 區(qū)別。具體說(shuō),區(qū)分區(qū)別。具體說(shuō),區(qū)分局部變量和靜態(tài)局部變量局部變量和靜態(tài)局部變量,全局全局 變量和靜態(tài)全局變量變量和靜態(tài)全局變量。 auto:前

42、面提到的局部變量都是自動(dòng)類型。其空間分配前面提到的局部變量都是自動(dòng)類型。其空間分配 于塊始,空間釋放于塊終,且由系統(tǒng)自動(dòng)進(jìn)行。自于塊始,空間釋放于塊終,且由系統(tǒng)自動(dòng)進(jìn)行。自 動(dòng)變量保存在棧中,且是在程序運(yùn)行過(guò)程中獲得和動(dòng)變量保存在棧中,且是在程序運(yùn)行過(guò)程中獲得和 釋放空間,未初始化時(shí)值為隨機(jī)數(shù)。釋放空間,未初始化時(shí)值為隨機(jī)數(shù)。 register:為提高程序運(yùn)行效率,可以將某些變量保存在為提高程序運(yùn)行效率,可以將某些變量保存在 寄存器中,即說(shuō)明為寄存器變量,但不提倡使用。寄存器中,即說(shuō)明為寄存器變量,但不提倡使用。 static:靜態(tài)變量。根據(jù)被修飾變量的位置不同,分為靜態(tài)變量。根據(jù)被修飾變量的

43、位置不同,分為 局部(內(nèi)部)靜態(tài)變量和全局(外部)靜態(tài)變量。局部(內(nèi)部)靜態(tài)變量和全局(外部)靜態(tài)變量。 所有靜態(tài)變量均存放在全局?jǐn)?shù)據(jù)區(qū)所有靜態(tài)變量均存放在全局?jǐn)?shù)據(jù)區(qū),編譯時(shí)獲得存,編譯時(shí)獲得存 儲(chǔ)空間,未初始化時(shí)自動(dòng)全儲(chǔ)空間,未初始化時(shí)自動(dòng)全0 0,且只初始化一次。,且只初始化一次。 局部靜態(tài)變量的局部靜態(tài)變量的作用域作用域?yàn)闉閴K域塊域,但,但生命期生命期為為整個(gè)整個(gè) 文件文件。即當(dāng)塊結(jié)束時(shí),局部靜態(tài)變量空間仍然保持,。即當(dāng)塊結(jié)束時(shí),局部靜態(tài)變量空間仍然保持, 直到整個(gè)程序文件結(jié)束時(shí)該局部靜態(tài)變量空間才釋放,直到整個(gè)程序文件結(jié)束時(shí)該局部靜態(tài)變量空間才釋放, 生命期結(jié)束。生命期結(jié)束。 【例【例

44、410】 自動(dòng)變量與局部靜態(tài)變量的區(qū)別。(演自動(dòng)變量與局部靜態(tài)變量的區(qū)別。(演 示)示) #include st() static int t=100; /局部靜態(tài)變量局部靜態(tài)變量 t+; return t; at() int t=100; /自動(dòng)變量自動(dòng)變量 t+;return t; void main() int i; for(i=0;i5;i+) coutat()t; coutendl; for(i=0;i5;i+) coutst()t; coutendl; i= 0 t= 100 12 34 5 101101101101101 i= 0 t=100 1 2 101 3 4 5 1021

45、03104105 #include st() static int t=100; /局部靜態(tài)變量局部靜態(tài)變量 t+; return t; at() int t=100; /自動(dòng)變量自動(dòng)變量 t+;return t; void main() int i; for(i=0;i5;i+) coutat()t; coutendl; for(i=0;i5;i+) coutst()t; coutendl; 全局靜態(tài)變量是指用全局靜態(tài)變量是指用static修飾的全局修飾的全局 變量。有關(guān)內(nèi)容在下節(jié)靜態(tài)存儲(chǔ)類型中介紹。變量。有關(guān)內(nèi)容在下節(jié)靜態(tài)存儲(chǔ)類型中介紹。 1. 外部存儲(chǔ)類型外部存儲(chǔ)類型 2. 靜態(tài)存儲(chǔ)類型

46、靜態(tài)存儲(chǔ)類型 一個(gè)一個(gè)C+C+程序可以由多個(gè)源程序文件組成,編譯系統(tǒng)程序可以由多個(gè)源程序文件組成,編譯系統(tǒng) 將這若干個(gè)文件連接在一起,產(chǎn)生可執(zhí)行程序。外部將這若干個(gè)文件連接在一起,產(chǎn)生可執(zhí)行程序。外部 存儲(chǔ)類型和靜態(tài)存儲(chǔ)類型確定了變量和函數(shù)在多文件存儲(chǔ)類型和靜態(tài)存儲(chǔ)類型確定了變量和函數(shù)在多文件 程序中的聯(lián)絡(luò)關(guān)系。程序中的聯(lián)絡(luò)關(guān)系。 外部存儲(chǔ)類型包括外部變量和外部函數(shù)。在由多個(gè)源程序外部存儲(chǔ)類型包括外部變量和外部函數(shù)。在由多個(gè)源程序 文件組成的程序中,如果一個(gè)文件要使用另一個(gè)文件中定文件組成的程序中,如果一個(gè)文件要使用另一個(gè)文件中定 義的全局變量或函數(shù),這些源程序文件之間通過(guò)外部類型義的全局變量

47、或函數(shù),這些源程序文件之間通過(guò)外部類型 的變量和函數(shù)進(jìn)行溝通。的變量和函數(shù)進(jìn)行溝通。 在一個(gè)文件中定義的全局變量和函數(shù)都缺省為外部的,即在一個(gè)文件中定義的全局變量和函數(shù)都缺省為外部的,即 其作用域可以延伸到程序的其他文件中。但其他文件如果其作用域可以延伸到程序的其他文件中。但其他文件如果 要使用這個(gè)文件中定義的全局變量和函數(shù),必須在使用前要使用這個(gè)文件中定義的全局變量和函數(shù),必須在使用前 用用“extern”extern”作外部聲明,外部聲明通常放在文件的開頭作外部聲明,外部聲明通常放在文件的開頭 。 變量定義時(shí)編譯器為其分配存儲(chǔ)空間,而變量聲明指明該變量定義時(shí)編譯器為其分配存儲(chǔ)空間,而變量聲

48、明指明該 全局變量已在其他地方說(shuō)明過(guò),編譯系統(tǒng)不再分配存儲(chǔ)空全局變量已在其他地方說(shuō)明過(guò),編譯系統(tǒng)不再分配存儲(chǔ)空 間,直接使用變量定義時(shí)所分配的空間。間,直接使用變量定義時(shí)所分配的空間。 函數(shù)聲明缺省為外部的,因此修飾詞函數(shù)聲明缺省為外部的,因此修飾詞externextern通常省略。通常省略。 【例【例4.11】外部存儲(chǔ)類型的例子。假定程序包含兩個(gè)源程序文件】外部存儲(chǔ)類型的例子。假定程序包含兩個(gè)源程序文件 Ex4_11_1.cpp和和Ex4_11_2.cpp,程序結(jié)構(gòu)如下:,程序結(jié)構(gòu)如下: /* Ex4_11_1.cpp ,由,由main()組成組成*/ # include void fun2

49、(); /外部函數(shù)聲明,等價(jià)于外部函數(shù)聲明,等價(jià)于extern void fun2(); int n; /全局變量定義全局變量定義 void main() n=1; fun2(); / fun2()定義在文件定義在文件Ex4_11_2.cpp中中 coutn=nendl; /* Ex4_11_2.cpp,由,由fun2()組成組成*/ extern int n; /外部變量聲明,外部變量聲明,n定義在文件定義在文件 Ex4_11_1.cpp中中 void fun2() /fun2()被文件被文件Ex4_11_1.cpp中的函數(shù)調(diào)用中的函數(shù)調(diào)用 n=3; 運(yùn)行結(jié)果:運(yùn)行結(jié)果:n=3 靜態(tài)存儲(chǔ)類型

50、包括靜態(tài)全局變量和靜態(tài)函數(shù)。在定義全局靜態(tài)存儲(chǔ)類型包括靜態(tài)全局變量和靜態(tài)函數(shù)。在定義全局 變量或函數(shù)時(shí)加說(shuō)明符變量或函數(shù)時(shí)加說(shuō)明符staticstatic,就成為靜態(tài)變量或靜態(tài)函,就成為靜態(tài)變量或靜態(tài)函 數(shù)。靜態(tài)存儲(chǔ)類型的作用域與外部存儲(chǔ)類型相反,一旦定數(shù)。靜態(tài)存儲(chǔ)類型的作用域與外部存儲(chǔ)類型相反,一旦定 義為靜態(tài)存儲(chǔ)類型,就限制該變量或函數(shù)只能在定義它的義為靜態(tài)存儲(chǔ)類型,就限制該變量或函數(shù)只能在定義它的 文件中使用。靜態(tài)全局變量在編譯時(shí)分配存儲(chǔ)空間,如果文件中使用。靜態(tài)全局變量在編譯時(shí)分配存儲(chǔ)空間,如果 定義時(shí)不指定初值,則編譯系統(tǒng)將其初始化為全定義時(shí)不指定初值,則編譯系統(tǒng)將其初始化為全0 0

51、。 一個(gè)全局變量和一個(gè)靜態(tài)全局變量在使用上是不同的,一個(gè)全局變量和一個(gè)靜態(tài)全局變量在使用上是不同的, 其他文件通過(guò)外部變量聲明可以使用一個(gè)全局變量,但其他文件通過(guò)外部變量聲明可以使用一個(gè)全局變量,但 卻無(wú)法使用靜態(tài)全局變量,卻無(wú)法使用靜態(tài)全局變量,靜態(tài)全局變量只能被定義它靜態(tài)全局變量只能被定義它 的文件所獨(dú)享的文件所獨(dú)享。函數(shù)與靜態(tài)函數(shù)之間的區(qū)別是相同的。函數(shù)與靜態(tài)函數(shù)之間的區(qū)別是相同的。 1. 生命期生命期 2. 可見(jiàn)性可見(jiàn)性 生命期(生命期(Life timeLife time)也叫生存期。生命期與存儲(chǔ)區(qū)域相關(guān),)也叫生存期。生命期與存儲(chǔ)區(qū)域相關(guān), 存儲(chǔ)區(qū)域分為代碼區(qū)、靜態(tài)數(shù)據(jù)區(qū)、棧區(qū)和堆

52、區(qū),相應(yīng)地,存儲(chǔ)區(qū)域分為代碼區(qū)、靜態(tài)數(shù)據(jù)區(qū)、棧區(qū)和堆區(qū),相應(yīng)地, 生命期分為生命期分為靜態(tài)生命期、局部生命期和動(dòng)態(tài)生命期靜態(tài)生命期、局部生命期和動(dòng)態(tài)生命期。 靜態(tài)生命期靜態(tài)生命期指的是標(biāo)識(shí)符從程序開始運(yùn)行時(shí)指的是標(biāo)識(shí)符從程序開始運(yùn)行時(shí) 存在,即具有存儲(chǔ)空間,到程序運(yùn)行結(jié)束時(shí)消亡,存在,即具有存儲(chǔ)空間,到程序運(yùn)行結(jié)束時(shí)消亡, 即釋放存儲(chǔ)空間。具有靜態(tài)生命期的標(biāo)識(shí)符存放即釋放存儲(chǔ)空間。具有靜態(tài)生命期的標(biāo)識(shí)符存放 在靜態(tài)數(shù)據(jù)區(qū),屬于靜態(tài)存儲(chǔ)類型,如全局變量、在靜態(tài)數(shù)據(jù)區(qū),屬于靜態(tài)存儲(chǔ)類型,如全局變量、 靜態(tài)全局變量、靜態(tài)局部變量。靜態(tài)全局變量、靜態(tài)局部變量。具有靜態(tài)生命期具有靜態(tài)生命期 的標(biāo)識(shí)符在未

53、被用戶初始化的情況下,系統(tǒng)會(huì)自的標(biāo)識(shí)符在未被用戶初始化的情況下,系統(tǒng)會(huì)自 動(dòng)將其初始化為全動(dòng)將其初始化為全0 0。 函數(shù)駐留在代碼區(qū),也具有靜態(tài)生命期。所函數(shù)駐留在代碼區(qū),也具有靜態(tài)生命期。所 有具有文件作用域的標(biāo)識(shí)符都具有靜態(tài)生命期。有具有文件作用域的標(biāo)識(shí)符都具有靜態(tài)生命期。 在函數(shù)內(nèi)部或塊中定義的標(biāo)識(shí)符具有局部生命在函數(shù)內(nèi)部或塊中定義的標(biāo)識(shí)符具有局部生命 期,其生命期開始于執(zhí)行到該函數(shù)或塊的標(biāo)識(shí)符聲期,其生命期開始于執(zhí)行到該函數(shù)或塊的標(biāo)識(shí)符聲 明處,結(jié)束于該函數(shù)或塊的結(jié)束處。具有靜態(tài)生命明處,結(jié)束于該函數(shù)或塊的結(jié)束處。具有靜態(tài)生命 期的標(biāo)識(shí)符存放在棧區(qū)。期的標(biāo)識(shí)符存放在棧區(qū)。具有局部生命期

54、的標(biāo)識(shí)符具有局部生命期的標(biāo)識(shí)符 如果未被初始化,其內(nèi)容是隨機(jī)的,不可用如果未被初始化,其內(nèi)容是隨機(jī)的,不可用。 具有局部生命期的標(biāo)識(shí)符必定具有局部作用域;具有局部生命期的標(biāo)識(shí)符必定具有局部作用域; 但反之不然,但反之不然,靜態(tài)局部變量具有局部作用域,但卻靜態(tài)局部變量具有局部作用域,但卻 具有靜態(tài)生命期具有靜態(tài)生命期。 具有動(dòng)態(tài)生命期的標(biāo)識(shí)符由特定的函數(shù)調(diào)具有動(dòng)態(tài)生命期的標(biāo)識(shí)符由特定的函數(shù)調(diào) 用或運(yùn)算來(lái)創(chuàng)建和釋放用或運(yùn)算來(lái)創(chuàng)建和釋放,如調(diào)用,如調(diào)用mallocmalloc() ()或用或用 newnew運(yùn)算符為變量分配存儲(chǔ)空間時(shí),變量的生命運(yùn)算符為變量分配存儲(chǔ)空間時(shí),變量的生命 期開始,而調(diào)用期

55、開始,而調(diào)用free()free()或用或用deletedelete運(yùn)算符釋放空間運(yùn)算符釋放空間 或程序結(jié)束時(shí),變量生命期結(jié)束。具有動(dòng)態(tài)生或程序結(jié)束時(shí),變量生命期結(jié)束。具有動(dòng)態(tài)生 命期的變量存放在堆區(qū)。關(guān)于命期的變量存放在堆區(qū)。關(guān)于newnew運(yùn)算和運(yùn)算和deletedelete 運(yùn)算將在指針一章中介紹運(yùn)算將在指針一章中介紹。 可見(jiàn)性可見(jiàn)性從另一個(gè)角度說(shuō)明標(biāo)識(shí)符的有效性,可見(jiàn)性與從另一個(gè)角度說(shuō)明標(biāo)識(shí)符的有效性,可見(jiàn)性與 作用域具有一定的一致性。作用域具有一定的一致性。標(biāo)識(shí)符的作用域包含可見(jiàn)標(biāo)識(shí)符的作用域包含可見(jiàn) 范圍,可見(jiàn)范圍不會(huì)超過(guò)作用域范圍,可見(jiàn)范圍不會(huì)超過(guò)作用域。可見(jiàn)性在理解同名??梢?jiàn)性

56、在理解同名 標(biāo)識(shí)符的標(biāo)識(shí)符的作用域嵌套作用域嵌套時(shí)十分直觀。對(duì)于外層塊與內(nèi)層時(shí)十分直觀。對(duì)于外層塊與內(nèi)層 塊定義了同名標(biāo)識(shí)符的,在外層作用域中,內(nèi)層所定塊定義了同名標(biāo)識(shí)符的,在外層作用域中,內(nèi)層所定 義的標(biāo)識(shí)符是不可見(jiàn)的,即外層引用的是外層所定義義的標(biāo)識(shí)符是不可見(jiàn)的,即外層引用的是外層所定義 的標(biāo)識(shí)符;同樣,的標(biāo)識(shí)符;同樣,在內(nèi)層作用域中,外層的標(biāo)識(shí)符將在內(nèi)層作用域中,外層的標(biāo)識(shí)符將 被內(nèi)層的同名標(biāo)識(shí)符屏蔽,變得不可見(jiàn)被內(nèi)層的同名標(biāo)識(shí)符屏蔽,變得不可見(jiàn),即外層中同,即外層中同 名標(biāo)識(shí)符的可見(jiàn)范圍為作用域中挖去內(nèi)層塊的范圍。名標(biāo)識(shí)符的可見(jiàn)范圍為作用域中挖去內(nèi)層塊的范圍。 圖圖4.64.6顯示下面

57、程序段中變量的作用域與可見(jiàn)性。顯示下面程序段中變量的作用域與可見(jiàn)性。 下面的程序段和圖示顯示作用域與下面的程序段和圖示顯示作用域與 可見(jiàn)性??梢?jiàn)性。 int m=1; float x; float m=3.5; X=5.5; m+; int m, float x作用域作用域 int m可見(jiàn)可見(jiàn) float m不可見(jiàn)不可見(jiàn) x可見(jiàn)可見(jiàn) float m作用域作用域 float m可見(jiàn)可見(jiàn) int m不可見(jiàn)不可見(jiàn) x可見(jiàn)可見(jiàn) 1n 1)!-(n*n 1n 1 0n 1 n 遞歸是一種描述問(wèn)題的方法,或稱算法。遞遞歸是一種描述問(wèn)題的方法,或稱算法。遞 歸的思想可以簡(jiǎn)單地描述為歸的思想可以簡(jiǎn)單地描述為“

58、自己調(diào)用自己自己調(diào)用自己”。 例如用如下方法定義階乘:例如用如下方法定義階乘: 可以看出是用階乘定義階乘,這種自可以看出是用階乘定義階乘,這種自 己定義自己的方法稱為遞歸定義。己定義自己的方法稱為遞歸定義。 在函數(shù)調(diào)用中,有這樣兩種情況,一種是在函數(shù)在函數(shù)調(diào)用中,有這樣兩種情況,一種是在函數(shù)A的定的定 義中有調(diào)用函數(shù)義中有調(diào)用函數(shù)A的語(yǔ)句,即自己調(diào)用自己;另一種是函數(shù)的語(yǔ)句,即自己調(diào)用自己;另一種是函數(shù) A的定義中出現(xiàn)調(diào)用函數(shù)的定義中出現(xiàn)調(diào)用函數(shù)B的語(yǔ)句,而函數(shù)的語(yǔ)句,而函數(shù)B的定義中也出的定義中也出 現(xiàn)調(diào)用函數(shù)現(xiàn)調(diào)用函數(shù)A的語(yǔ)句,即相互調(diào)用。前者稱的語(yǔ)句,即相互調(diào)用。前者稱直接遞歸直接遞歸,

59、后者,后者 稱稱間接遞歸間接遞歸。本節(jié)只介紹直接遞歸。遞歸函數(shù)必須定義遞。本節(jié)只介紹直接遞歸。遞歸函數(shù)必須定義遞 歸歸終止條件終止條件(Stopping condition),避免無(wú)窮遞歸(),避免無(wú)窮遞歸( Infinite Recursion)。)。 遞歸定義的階乘算法用函數(shù)描述為:遞歸定義的階乘算法用函數(shù)描述為: fac(int n) if (n=0|n=1) return 1; else return n*fac(n-1); 只要設(shè)計(jì)主函數(shù)調(diào)用階乘函數(shù),即可實(shí)現(xiàn)計(jì)算階乘。只要設(shè)計(jì)主函數(shù)調(diào)用階乘函數(shù),即可實(shí)現(xiàn)計(jì)算階乘。 【例【例412】 求求4! #include int fac(int

60、 n) int y; coutnt; if(n=0|n=1) y=1; else y=n*fac(n-1); coutyt; return y; void main() coutn4!=fac(4)endl; n=4 cout4; y=4*fac(3); fac(4)= cout2; y=2*fac(1); n=2 cout1; y=1; cout1; return 1; n=1 n=3 cout3; y=3*fac(2); cout24; return 24; cout6; return 6; cout2; return 2; 24 遞歸函數(shù)的執(zhí)行分為遞歸函數(shù)的執(zhí)行分為“遞推遞推”和和“回歸

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論