版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(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)行模塊劃分的基本單位。一個(gè)函數(shù)實(shí)現(xiàn)一項(xiàng)功能。 在面向?qū)ο蟪绦蛟O(shè)計(jì)中,函數(shù)是對(duì)數(shù)據(jù)的一項(xiàng)操作,也是實(shí)現(xiàn)一項(xiàng)功能。,第三章 函數(shù),要掌握函數(shù)的使用,必須理解函數(shù)調(diào)用時(shí)的內(nèi)部實(shí)現(xiàn)機(jī)制,以及與此相關(guān)的內(nèi)存分配機(jī)制、變量生命期和作用域。,本章還將介紹關(guān)于函數(shù)重載的概念,介紹遞歸算法、內(nèi)聯(lián)函數(shù)、默認(rèn)參數(shù)函數(shù)以及多文件組織、編譯預(yù)處理、工程文件的概念和運(yùn)行庫函數(shù)。,第三章 函數(shù),3.1 函數(shù)的定義與調(diào)用,3. 5 作用域與標(biāo)識(shí)符的可見性,3.4 函數(shù)調(diào)用機(jī)制,3.3 全局變量和局部變量,3.2 函數(shù)的參數(shù)傳遞, 返回值及函數(shù)聲明,3.10 編譯預(yù)處理,3.9 頭文件與多文件
2、結(jié)構(gòu),3.6 存儲(chǔ)類型與標(biāo)識(shí)符的生命期,3.8 函數(shù)的一些高級(jí)議題,3.7 函數(shù)的遞歸調(diào)用,3.1 函數(shù)的定義與調(diào)用,3.1.1 函數(shù)概述,3.1.2 函數(shù)的定義,3.1.3 函數(shù)的調(diào)用,3.1.1 函數(shù)概述,函數(shù)是C+程序的基本組成模塊。,通過函數(shù),可以把一個(gè)復(fù)雜任務(wù)分解成為若干個(gè)易于解決的小任務(wù)。充分體現(xiàn)逐步細(xì)化的設(shè)計(jì)思想。,組成C+程序的若干函數(shù)中,有一個(gè)稱為main()(Winmain())函數(shù),是程序執(zhí)行的入口,它可以調(diào)用其他函數(shù),但不可以被調(diào)用。而其他一般函數(shù)既可以調(diào)用也可以被調(diào)用。,函數(shù)概念的引入:,入口函數(shù):,3.1.1 函數(shù)概述,3.1.1 函數(shù)概述,3.1.1結(jié)束,庫函數(shù)和
3、自定義函數(shù): 庫函數(shù)或標(biāo)準(zhǔn)函數(shù),是由編譯系統(tǒng)預(yù)定義的,如一些常用的數(shù)學(xué)計(jì)算函數(shù)、字符串處理函數(shù)、圖形處理函數(shù)、標(biāo)準(zhǔn)輸入輸出函數(shù)等。 庫函數(shù)都按功能分類,集中說明在不同的頭文件中。用戶只需在自己的程序中包含某個(gè)頭文件,就可直接使用該文件中定義的函數(shù)。 用戶根據(jù)需要將某個(gè)具有相對(duì)獨(dú)立功能的程序定義為函數(shù),稱自定義函數(shù)。,3.1.2 函數(shù)的定義,無參函數(shù)定義格式為: 數(shù)據(jù)類型函數(shù)名(void)函數(shù)體,說明: 數(shù)據(jù)類型指函數(shù)返回值類型,可以是任一種數(shù)據(jù)類型,默認(rèn)為返回整型值(但新標(biāo)準(zhǔn)要求寫明,不用默認(rèn)方式)。沒有返回值應(yīng)將返回值類型定義為void。 函數(shù)名采用合法標(biāo)識(shí)符表示。 對(duì)無參函數(shù),參數(shù)括號(hào)中的
4、void通常省略,但括號(hào)不能省略。 函數(shù)體由一系列語句組成。函數(shù)體可以為空,稱為空函數(shù)。,1 無參函數(shù),3.1.2 函數(shù)的定義,/打印一個(gè)表頭 void TableHead ( ) cout*endl; cout* example *endl; cout*endl; ,int input ( )/輸入滿足要求的數(shù)據(jù) int n; coutn; while(n=5); return n; ,2 有參函數(shù),有參函數(shù)的定義格式為 數(shù)據(jù)類型函數(shù)名 (參數(shù)類型1形式參數(shù)1,參數(shù)類型2形式參數(shù)2,函數(shù)體,/返回兩個(gè)整數(shù)中的較大值 int max (int a, int b) return(a=b?a:b)
5、; ,有參函數(shù)的參數(shù)表中列出所有形式參數(shù)的類型和參數(shù)名稱。各參數(shù)即使類型相同也必須分別加以說明。 形式參數(shù)簡(jiǎn)稱形參,只能是變量名,不允許是常量或表達(dá)式。,void delay(long n) int i; for (i=0;in;i+); /延時(shí)一段時(shí)間,問題:定義函數(shù)時(shí)究竟哪些變量應(yīng)當(dāng)作為函數(shù)的參數(shù)?哪些應(yīng)當(dāng)定義在函數(shù)體內(nèi)? 原則:函數(shù)在使用時(shí)被看成 “黑匣子”,除了輸入輸出外,其他部分可不必關(guān)心。從函數(shù)的定義看出,函數(shù)頭正是用來反映函數(shù)的功能和使用接口,它所定義的是“做什么”。即明確了“黑匣子”的輸入輸出部分,輸出就是函數(shù)的返回值,輸入就是參數(shù)。因此,只有那些功能上起自變量作用的變量才必須
6、作為參數(shù)定義在參數(shù)表中;函數(shù)體中具體描述“如何做”,因此除參數(shù)之外的為實(shí)現(xiàn)算法所需用的變量應(yīng)當(dāng)定義在函數(shù)體內(nèi)。 C+中不允許函數(shù)的嵌套定義,即不允許在一個(gè)函數(shù)中定義另一個(gè)函數(shù)。,提示,3.1.3 函數(shù)的調(diào)用,函數(shù)調(diào)用: 所謂函數(shù)調(diào)用,就是使程序轉(zhuǎn)去執(zhí)行函數(shù)體。 在C+中,除了主函數(shù)外,其他任何函數(shù)都不能單獨(dú)作為程序運(yùn)行。任何函數(shù)功能的實(shí)現(xiàn)都是通過被主函數(shù)直接或間接調(diào)用進(jìn)行的。 無參函數(shù)的調(diào)用格式: 函數(shù)名( ) 有參函數(shù)的調(diào)用格式: 函數(shù)名(實(shí)際參數(shù)表) 其中實(shí)際參數(shù)簡(jiǎn)稱實(shí)參,用來將實(shí)際參數(shù)的值傳遞給形參,因此可以是常量、具有值的變量或表達(dá)式。,【例3.1】 輸入兩個(gè)實(shí)數(shù),輸出其中較大的數(shù),3
7、.2 函數(shù)的參數(shù)傳遞、返回值及函數(shù)聲明,321 函數(shù)的參數(shù)傳遞及傳值調(diào)用,323 函數(shù)聲明,322 函數(shù)返回值,參數(shù)傳遞: 函數(shù)調(diào)用首先要進(jìn)行參數(shù)傳遞,參數(shù)傳遞的方向是由實(shí)參傳遞給形參。 傳遞過程是,先計(jì)算實(shí)參表達(dá)式的值,再將該值傳遞給對(duì)應(yīng)的形參變量。一般情況下,實(shí)參和形參的個(gè)數(shù)和排列順序應(yīng)一一對(duì)應(yīng),并且對(duì)應(yīng)參數(shù)應(yīng)類型匹配(賦值兼容),即實(shí)參的類型可以轉(zhuǎn)化為形參類型。而對(duì)應(yīng)參數(shù)的參數(shù)名則不要求相同。總而言之:參數(shù)要求位置匹配,3.2.1 函數(shù)的參數(shù)傳遞及傳值調(diào)用,傳值調(diào)用和引用調(diào)用: 按照參數(shù)形式的不同,C+有兩種調(diào)用方式:傳值調(diào)用和引用調(diào)用。傳值調(diào)用傳遞的是實(shí)參的值,本章介紹傳值調(diào)用。,3.
8、2.1 函數(shù)的參數(shù)傳遞及傳值調(diào)用,傳值調(diào)用: 將實(shí)參的值復(fù)制給形參,在函數(shù)中參加運(yùn)算的是形參,而實(shí)參不會(huì)發(fā)生任何改變。傳值調(diào)用起了一種隔離作用。,【例3.2】 實(shí)參和形參對(duì)應(yīng)關(guān)系的示例。,注意:【例1.3】中調(diào)用函數(shù)strcpy(s3, s2),卻實(shí)現(xiàn)了字符數(shù)組s2的內(nèi)容復(fù)制到字符數(shù)組s3中。這是因?yàn)閿?shù)組名實(shí)際上代表存儲(chǔ)數(shù)組的內(nèi)存的首地址,復(fù)制給形參的是實(shí)參數(shù)組的首地址,結(jié)果參加運(yùn)算的是實(shí)參數(shù)組。數(shù)組作為參數(shù),定義時(shí)形參用數(shù)組名加一對(duì)方括號(hào),調(diào)用時(shí)實(shí)參只用數(shù)組名,3.2.2 函數(shù)返回值,對(duì)于有返回值的函數(shù),在函數(shù)的出口處必須用return語句將要返回的值返回給調(diào)用者。 return語句的格式:
9、 return 表達(dá)式; 其中表達(dá)式的值即函數(shù)要返回的值。執(zhí)行該語句時(shí),首先計(jì)算表達(dá)式的值,然后將其轉(zhuǎn)化為返回值類型所規(guī)定的類型返回,同時(shí)結(jié)束函數(shù)的執(zhí)行,返回到調(diào)用處繼續(xù)執(zhí)行。與函數(shù)調(diào)用一樣,返回也有引用方式。,【例3.3】設(shè)計(jì)函數(shù),根據(jù)三角形的三邊長(zhǎng)求面積。如果不能構(gòu)成三角形,給出提示信息。 分析:函數(shù)為計(jì)算三角形面積,一般三角形返回面積值,若不能構(gòu)成三角形則返回-1。設(shè)計(jì)一個(gè)主函數(shù)完成函數(shù)測(cè)試。根據(jù)返回值情況輸出相應(yīng)結(jié)果。,3.2.2 函數(shù)返回值,討論: 函數(shù)可以有返回值,也可以沒有返回值。對(duì)于沒有返回值的函數(shù),功能只是完成一定操作,應(yīng)將返回值類型定義為void ,函數(shù)體內(nèi)可以沒有retu
10、rn語句,當(dāng)需要在程序指定位置退出時(shí),可以在該處放置一個(gè): return ; 返回值是如何返回到調(diào)用處的?實(shí)際上,在函數(shù)返回時(shí),系統(tǒng)會(huì)在內(nèi)存建立一個(gè)臨時(shí)變量,函數(shù)返回時(shí)將函數(shù)值保存在該臨時(shí)變量中,然后由主調(diào)函數(shù)中包含調(diào)用的表達(dá)式語句從該臨時(shí)變量中取得值,表達(dá)式語句執(zhí)行后該臨時(shí)變量撤銷。,3.2.2結(jié)束,3.2.3 函數(shù)聲明,函數(shù)聲明是一條以分號(hào)結(jié)束的語句: 函數(shù)返回值類型函數(shù)名 (形參表);,語法上對(duì)程序文件中函數(shù)的排列次序要求滿足先定義后使用。對(duì)于函數(shù),只要在調(diào)用之前作函數(shù)聲明(Function Declaration),則函數(shù)定義放在任何位置程序都能正確編譯運(yùn)行。,其中形參表可以逐個(gè)列出每
11、個(gè)參數(shù)的類型和參數(shù)名,也可以列出每個(gè)形參的類型,參數(shù)名可省略,各形參之間以逗號(hào)分隔。函數(shù)聲明和所定義的函數(shù)必須在返回值類型、函數(shù)名、形參個(gè)數(shù)和類型及次序等方面完全對(duì)應(yīng)一致,否則將導(dǎo)致編譯錯(cuò)誤。,函數(shù)聲明的引入:,函數(shù)聲明的格式:,3.2.3 函數(shù)聲明,例如【例3.3】中求三角形面積的函數(shù)聲明為: float TriangleArea(float a,float b,float c); 或 float TriangleArea(float,float,float); 但下面的函數(shù)原型是錯(cuò)誤的: int TriangleArea (float,float,float);/錯(cuò)誤,返回值類型不同 fl
12、oat TriangleArea(int,int,int); /錯(cuò)誤,參數(shù)類型不同 float TriangleArea(float,float);/錯(cuò)誤,參數(shù)個(gè)數(shù)不同 按照由粗到精、逐步細(xì)化的結(jié)構(gòu)化程序設(shè)計(jì)思想,程序設(shè)計(jì)一般從主函數(shù)入手,其中某些功能用函數(shù)調(diào)用語句完成,描述出程序的總體功能框架;然后再逐層深入,完成每個(gè)函數(shù)的具體實(shí)現(xiàn)。按此思路設(shè)計(jì)出的程序必然將主函數(shù)安排在前,而函數(shù)定義安排在后,但這樣不符合先定義后使用的原則,編譯無法通過,用函數(shù)聲明則可解決這一問題。,下面是一個(gè)使用結(jié)構(gòu)化程序設(shè)計(jì)思想開發(fā)的企業(yè)管理報(bào)表程序的框架。它使用了函數(shù)聲明。 void menu_print(); vo
13、id account_report(); void engineering_report(); void marketing_report(); int 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; return 0;,void menu_print() cout”系統(tǒng)功能:”
14、endl; cout”1財(cái)務(wù)報(bào)表”endl; cout”2工程報(bào)表”endl; cout”3市場(chǎng)報(bào)表”endl; cout”選擇業(yè)務(wù)序號(hào):”; void account_report() /生成財(cái)務(wù)報(bào)表 void engineering_report() /生成工程報(bào)表 void marketing_report() /生成市場(chǎng)報(bào)表; ,3.2.3 函數(shù)聲明,【例3.4】 輸出所有滿足下列條件的正整數(shù)m:10m1000且m、m2、m3均為回文數(shù)。,分析:回文指左右對(duì)稱的序列。如121、353等就是回文數(shù)。判斷整數(shù)是否回文數(shù)用函數(shù)實(shí)現(xiàn),其思想是將該數(shù)各位拆開后反向組成新的整數(shù),如果該整數(shù)與原數(shù)相
15、等則為回文數(shù)。,m m*m m*m*m 11 121 1331 101 10201 1030301 111 12321 1367631,運(yùn)行結(jié)果:,3.3 全局變量和局部變量,331 變量的存儲(chǔ)機(jī)制與C+的內(nèi)存布局,332 全局變量,333 局部變量,3.3.1 變量的存儲(chǔ)機(jī)制與C+的內(nèi)存布局,自由存儲(chǔ)區(qū) (動(dòng)態(tài)數(shù)據(jù)),操作系統(tǒng)為一個(gè)C+程序的運(yùn)行所分配的內(nèi)存分為四個(gè)區(qū)域,如圖3.3 所示:,存儲(chǔ)區(qū)域說明: (1)代碼區(qū)(Code area):存放程序代碼,即程序中各個(gè)函數(shù)的代碼塊; (2)全局?jǐn)?shù)據(jù)區(qū)(Data area):存放全局?jǐn)?shù)據(jù)和靜態(tài)數(shù)據(jù);分配該區(qū)時(shí)內(nèi)存全部清零,結(jié)果變量的所有字節(jié)等效
16、初始化為全。 (3)棧區(qū)(Stack area):存放局部變量,如函數(shù)中的變量等;分配棧區(qū)時(shí)不處理內(nèi)存,即變量取隨機(jī)值。 (4)自由存儲(chǔ)區(qū)(Free store area):存放與指針相關(guān)的動(dòng)態(tài)數(shù)據(jù)。分配自由存儲(chǔ)區(qū)時(shí)不處理內(nèi)存。參見第七章。,3.3.1 變量的存儲(chǔ)機(jī)制與C+的內(nèi)存布局,3.3.2 全局變量,在所有函數(shù)之外定義的變量稱為全局變量。,全局變量存放在全局?jǐn)?shù)據(jù)區(qū),因編譯器自動(dòng)將該區(qū)清為全0,如果用戶在定義時(shí)不顯式給出初始化值,則等效初始化為全0 。,全局變量可定義在程序開頭,也可定義在中間位置,該全局變量在定義處之后的任何位置都是可以訪問的,稱為可見的。,【例3.5】 多個(gè)函數(shù)使用全局
17、變量的例子。,全局變量引入:,3.3.3 局部變量,定義在函數(shù)內(nèi)或塊內(nèi)的變量稱為局部變量。,程序中使用的絕大多數(shù)變量都是局部變量。,局部變量在程序運(yùn)行到它所在的塊時(shí)建立在棧中,該塊執(zhí)行完畢局部變量占有的空間即被釋放。故亦稱為自動(dòng)變量。,局部變量在定義時(shí)可加修飾詞auto,但通常省略。局部變量在定義時(shí)若未初始化,其值為隨機(jī)數(shù)。,局部變量引入:,【例3.6】 使用局部變量的例子。,3.4 函數(shù)調(diào)用機(jī)制,局部變量占用的內(nèi)存是在程序執(zhí)行過程中“動(dòng)態(tài)”地建立和釋放的。這種“動(dòng)態(tài)”是通過棧由系統(tǒng)自動(dòng)管理進(jìn)行的。,(1)建立??臻g;,(6)恢復(fù)現(xiàn)場(chǎng):取主調(diào)函數(shù)運(yùn)行狀態(tài)及返回地址,釋放??臻g;,(7)繼續(xù)主調(diào)
18、函數(shù)后續(xù)語句。,(5)釋放被調(diào)函數(shù)中局部變量占用的??臻g;,(4)執(zhí)行被調(diào)函數(shù)函數(shù)體;,(3)為被調(diào)函數(shù)中的局部變量分配空間,完成參數(shù)傳遞;,(2)保護(hù)現(xiàn)場(chǎng):主調(diào)函數(shù)運(yùn)行狀態(tài)和返回地址入棧;,調(diào)用過程:,3.4 函數(shù)調(diào)用機(jī)制,void fun1(int, int); void fun2(float); int main() int x=1;y=2; fun1(x, y); return o; void fun1(int a,int b) float x=3; fun2(x); void fun2(float y) int x; ,此圖例說明在程序執(zhí)行過程中怎樣通過?!皠?dòng)態(tài)”地建立和釋放局部變量
19、占用的內(nèi)存的,3.5 作用域與標(biāo)識(shí)符的可見性,3 文件域,2 函數(shù)聲明域,作用域:指標(biāo)識(shí)符能夠被使用的范圍。只有在作用域內(nèi)標(biāo)識(shí)符才可以被訪問(稱為可見)。,本節(jié)重點(diǎn)討論局部域和文件域(全局域),其中局部域包括塊域和函數(shù)聲明域。任何標(biāo)識(shí)符作用域的起始點(diǎn)均為標(biāo)識(shí)符說明處。,下面分別介紹:,1 塊域,函數(shù)中定義的標(biāo)識(shí)符,包括形參和函數(shù)體中定義的局部變量,作用域都在該函數(shù)內(nèi),也稱作函數(shù)域。,塊域,塊指一對(duì)大括號(hào)括起來的程序段。塊中定義的標(biāo)識(shí)符,作用域在塊內(nèi)。,復(fù)合語句是一個(gè)塊。,函數(shù)也是一個(gè)塊。,復(fù)合語句中定義的標(biāo)識(shí)符,,作用域僅在該復(fù)合語句中。,【例3.7】 輸入兩數(shù),按從大到小的順序保存。,塊的引
20、入:,塊域,由VC+運(yùn)行,結(jié)果如下: 輸入兩整數(shù): 3 5 調(diào)用前:實(shí)參a=3,b=5 調(diào)用中 交換前:形參a=3,b=5 交換后:形參a=5,b=3 調(diào)用后:實(shí)參a=3,b=5 交換失敗,局部變量具有局部作用域使得程序在不同塊中可以使用同名變量。這些同名變量各自在自己的作用域中可見,在其它地方不可見。,【例3.8】設(shè)計(jì)函數(shù)完成兩數(shù)交換,用主函數(shù)進(jìn)行測(cè)試。,塊域,對(duì)于塊中嵌套其它塊的情況,如果嵌套塊中有同名局部變量,服從局部?jī)?yōu)先原則,即在內(nèi)層塊中屏蔽外層塊中的同名變量,換句話說,內(nèi)層塊中局部變量的作用域?yàn)閮?nèi)層塊;外層塊中局部變量的作用域?yàn)橥鈱映グ兞康膬?nèi)層塊部分。,如果塊內(nèi)定義的局部變
21、量與全局變量同名,塊內(nèi)仍然局部變量?jī)?yōu)先,但與塊作用域不同的是,在塊內(nèi)可以通過域運(yùn)算符“:”訪問同名的全局變量。,【例3.9】 顯示同名變量可見性。,函數(shù)聲明域,函數(shù)聲明不是定義函數(shù),在作函數(shù)聲明時(shí),其中的形參作用域只在聲明中,即作用域結(jié)束于右括號(hào)。正是由于形參不能被程序的其他地方引用,所以通常只要聲明形參個(gè)數(shù)和類型,形參名可省略。,3 文件域,文件域也稱全局域。定義在所有函數(shù)之外的標(biāo)識(shí)符作用域?yàn)閺亩x處到整個(gè)源文件結(jié)束,即文件域 。文件中定義的全局變量和函數(shù)的作用域?yàn)槲募颉?如果某個(gè)文件中說明了作用域?yàn)槲募虻臉?biāo)識(shí)符,該文件又被另一個(gè)文件包含,則該標(biāo)識(shí)符的作用域延伸到新的文件中。如cin和c
22、out是在頭文件iostream中說明的具有文件作用域的標(biāo)識(shí)符,它們的作用域也延伸到嵌入iostream的文件中。,存儲(chǔ)類型(storage class)決定標(biāo)識(shí)符的存儲(chǔ)區(qū)域,即編譯系統(tǒng)在不同區(qū)域?yàn)椴煌鎯?chǔ)類型的標(biāo)識(shí)符分配空間。由于存儲(chǔ)區(qū)域不同,標(biāo)識(shí)符的生命期也不同。所謂生命期,指的是標(biāo)識(shí)符從獲得空間到空間釋放之間的期間,標(biāo)識(shí)符只有在生存期中、并且在其自己的作用域中才能被訪問。,3.6 存儲(chǔ)類型與標(biāo)識(shí)符的生命期,3.6.1 存儲(chǔ)類型,3.3.2 生命期,自動(dòng)變量為用auto說明的變量,通常auto缺省。局部變量都是自動(dòng)變量,生命期開始于塊的執(zhí)行,結(jié)束于塊的結(jié)束,其原因是自動(dòng)變量的空間分配在棧中
23、,塊開始執(zhí)行時(shí)系統(tǒng)自動(dòng)分配空間,塊執(zhí)行結(jié)束時(shí)系統(tǒng)自動(dòng)釋放空間。故自動(dòng)變量的生命期和作用域是一致的。,3.6.1 存儲(chǔ)類型,為提高程序運(yùn)行效率,可以將某些變量保存在寄存器中,即用register說明為寄存器變量,但不提倡使用。,C+中關(guān)于存儲(chǔ)類型的說明符(storage class specifier)有四個(gè):auto、register、static和extern。其中用auto和register修飾的稱為自動(dòng)存儲(chǔ)類型,用static修飾的稱為靜態(tài)存儲(chǔ)類型,用extern修飾的稱為外部存儲(chǔ)類型。,1 自動(dòng)存儲(chǔ)類型,static說明的變量稱為靜態(tài)變量。根據(jù)定義的位置不同,還分為局部靜態(tài)變量和全局靜
24、態(tài)變量,也稱內(nèi)部靜態(tài)變量和外部靜態(tài)變量。靜態(tài)變量均存儲(chǔ)在全局?jǐn)?shù)據(jù)區(qū),如果程序未顯式給出初始化值,則等效初始化為全0;靜態(tài)變量占有的空間要到整個(gè)程序執(zhí)行結(jié)束才釋放,故靜態(tài)變量具有整個(gè)程序執(zhí)行期間的生命期。,3.6.1 存儲(chǔ)類型,局部靜態(tài)變量是定義在塊中的靜態(tài)變量,編譯系統(tǒng)在全局?jǐn)?shù)據(jù)區(qū)為其開辟空間并保存數(shù)據(jù),該空間一直到整個(gè)程序結(jié)束才釋放。局部靜態(tài)變量具有局部作用域,但卻具有整個(gè)程序執(zhí)行期間的生命期。如果顯式給出初始化值,則在該塊第一次執(zhí)行時(shí)完成,且只進(jìn)行一次。,2 靜態(tài)存儲(chǔ)類型,【例3.10】 自動(dòng)變量與局部靜態(tài)變量的區(qū)別,3.6.1 存儲(chǔ)類型,3 外部存儲(chǔ)類型,一個(gè)C+程序可以由多個(gè)源程序文件
25、組成。多文件程序系統(tǒng)可以通過外部存儲(chǔ)類型的變量和函數(shù)來共享某些數(shù)據(jù)和操作。,在一個(gè)程序文件中定義的全局變量和函數(shù)缺省為外部的,即其作用域可以延伸到程序的其他文件中。其他文件如果要使用這個(gè)文件中定義的全局變量和函數(shù),應(yīng)該在使用前用“extern”作外部聲明。外部聲明通常放在文件的開頭(函數(shù)總是省略extern)。,外部變量聲明不同于全局變量定義,變量定義時(shí)編譯器為其分配存儲(chǔ)空間,而變量聲明則表示該全局變量已在其他地方定義過,編譯系統(tǒng)不再分配存儲(chǔ)空間。,外部的全局變量或函數(shù)加上static修飾,就成為靜態(tài)全局變量或靜態(tài)函數(shù)。靜態(tài)的全局變量和函數(shù)作用域限制在本文件,其他文件即使使用外部聲明也無法使用
26、該全局變量或函數(shù)。,【例3.11】外部存儲(chǔ)類型的例子,3.6.2 生命期,1. 靜態(tài)生命期,靜態(tài)生命期(Static extent或Static storage duration)指的是標(biāo)識(shí)符從程序開始運(yùn)行時(shí)就存在,具有存儲(chǔ)空間,到程序運(yùn)行結(jié)束時(shí)消亡,釋放存儲(chǔ)空間。具有靜態(tài)生命期的標(biāo)識(shí)符存放在全局?jǐn)?shù)據(jù)區(qū),如全局變量、靜態(tài)全局變量、靜態(tài)局部變量。具有靜態(tài)生命期的標(biāo)識(shí)符在未被用戶初始化的情況下,系統(tǒng)會(huì)等效將其初始化為全0。 函數(shù)駐留在代碼區(qū),也具有靜態(tài)生命期。所有具有文件作用域的標(biāo)識(shí)符都具有靜態(tài)生命期。,3.6.2 生命期,2. 局部生命期,在函數(shù)內(nèi)部或塊中定義的標(biāo)識(shí)符具有局部生命期(Automa
27、tic extent或Automatic storage duration),其生命期開始于執(zhí)行到該函數(shù)或塊的標(biāo)識(shí)符定義處,結(jié)束于該函數(shù)或塊的結(jié)束處。具有局部生命期的標(biāo)識(shí)符存放在棧區(qū)。具有局部生命期的標(biāo)識(shí)符如果未被初始化,其內(nèi)容是隨機(jī)的,不可引用。 具有局部生命期的標(biāo)識(shí)符必定具有局部作用域;但反之不然,靜態(tài)局部變量具有局部作用域,但卻具有靜態(tài)生命期。,3.6.2 生命期,具有動(dòng)態(tài)生命期(dynamic extent或dynamic storage duration)的標(biāo)識(shí)符存放在自由存儲(chǔ)區(qū),由特定的函數(shù)調(diào)用或運(yùn)算來創(chuàng)建和釋放,如用new運(yùn)算符(或調(diào)用malloc()函數(shù))為變量分配存儲(chǔ)空間時(shí),
28、變量的生命期開始,而用delete運(yùn)算符(或調(diào)用free()函數(shù))釋放空間或程序結(jié)束時(shí),變量生命期結(jié)束。關(guān)于new運(yùn)算符和delete運(yùn)算符將在第七章中介紹。,3. 動(dòng)態(tài)生命期,3.7 函數(shù)的遞歸調(diào)用,遞歸是一種描述問題的方法,或稱算法。遞歸的思想可以簡(jiǎn)單地描述為“自己調(diào)用自己”。例如用如下方法定義階乘:,可以看出是用階乘定義階乘,這種自己定義自己的方法稱為遞歸定義。,遞歸的引入:,遞歸的分類 在函數(shù)調(diào)用中,有這樣兩種情況,一種是在函數(shù)A的定義中有調(diào)用函數(shù)A的語句,即自己調(diào)用自己;另一種是函數(shù)A的定義中出現(xiàn)調(diào)用函數(shù)B的語句,而函數(shù)B的定義中也出現(xiàn)調(diào)用函數(shù)A的語句,即相互調(diào)用。前者稱直接遞歸,后
29、者稱間接遞歸。本節(jié)只介紹直接遞歸。,遞歸定義的階乘函數(shù): fac(int n) int y; if (n=0|n=1) y=1; else y=n*fac(n-1); return y; 只要設(shè)計(jì)主函數(shù)調(diào)用階乘函數(shù),即可實(shí)現(xiàn)計(jì)算階乘。 遞歸函數(shù)必須定義遞歸終止條件(Stopping condition),避免無窮遞歸(Infinite Recursion)。,3.7 函數(shù)的遞歸調(diào)用,【例3.12】 求4!,運(yùn)行結(jié)果: 4 3 2 1 1 2 6 24 4!=24,3.7 函數(shù)的遞歸調(diào)用,探討: 計(jì)算是先右后左。請(qǐng)看下一條輸出語句: coutn4!=fac(4) n3!=fac(3)endl;
30、先算fac(3), 后算fac(4), 先右后左。但輸出還是從左到右: 3 21126 432112624 4!=24 3!=6,說明: coutn4!=fac(4)endl; 執(zhí)行時(shí)是先算函數(shù)值,然后再?gòu)淖蟮接逸敵龈鞅磉_(dá)式的值。所以有兩行輸出,而不是第一行插在第二行賦值號(hào)與24之間。,3.7 函數(shù)的遞歸調(diào)用,遞歸過程的分析: 遞歸函數(shù)的執(zhí)行分為“遞推”和“回歸”兩個(gè)過程,這兩個(gè)過程由遞歸終止條件控制,即逐層遞推,直至遞歸終止條件,然后逐層回歸。每次調(diào)用發(fā)生時(shí)都首先判斷遞歸終止條件。 遞歸調(diào)用同普通的函數(shù)調(diào)用一樣,每當(dāng)調(diào)用發(fā)生時(shí),在棧中分配單元保存返回地址以及參數(shù)和局部變量;而與普通的函數(shù)調(diào)用
31、不同的是,由于遞推的過程是一個(gè)逐層調(diào)用的過程,因此存在一個(gè)逐層連續(xù)的參數(shù)入棧過程,直至遇到遞歸終止條件時(shí),才開始回歸,這時(shí)才逐層釋放棧空間,返回到上一層,直至最后返回到主調(diào)函數(shù)。,3.7 函數(shù)的遞歸調(diào)用,現(xiàn)場(chǎng)與返回地址,第一層fac(4)域,4,n,4*624,y,現(xiàn)場(chǎng)與返回地址,第二層fac(3)域,3,n,3*26,y,現(xiàn)場(chǎng)與返回地址,第三層fac(2)域,2,n,2*12,y,現(xiàn)場(chǎng)與返回地址,第四層fac(1)域,n,y,1,1,存fac(1)返回值,存fac(2)返回值,存fac(3)返回值,1,2,6,fac(4)返回值=,24,main()域,注意: 右圖中存“fac(1)返回值”
32、等的存儲(chǔ)單元是無名臨時(shí)局部變量,其生命期在表達(dá)式y(tǒng)=n*fac(n-1)中。 因?yàn)楸徽{(diào)函數(shù)的返回語句格式為: return 表達(dá)式; 為返回表達(dá)式的值,必須有一個(gè)無名臨時(shí)局部變量來承載這個(gè)值。然后由主調(diào)函數(shù)中包含調(diào)用的表達(dá)式語句從該臨時(shí)變量中取得值,表達(dá)式語句執(zhí)行后該臨時(shí)變量撤銷。,存fac(4)返回值,24,3.7 函數(shù)的遞歸調(diào)用,從以上幾例可以看出,遞歸算法一般不需要借助循環(huán),但通過不斷遞推和回歸的過程實(shí)現(xiàn)了其他算法用循環(huán)完成的功能。因此,遞歸的終止條件非常重要,否則將會(huì)無休止地遞歸下去,陷入死循環(huán)狀態(tài)。,【例3.14】 輸入一個(gè)整數(shù),用遞歸算法將整數(shù)倒序輸出,【例3.13】 漢諾塔問題,
33、圖3.10 遞歸求解斐波那契數(shù)列調(diào)用樹,同其他算法相比,用遞歸算法編制的程序非常簡(jiǎn)潔易讀,但缺點(diǎn)是增加了內(nèi)存的開銷,在遞推的過程中會(huì)占用大量??臻g,且連續(xù)的調(diào)用返回操作占用較多CPU時(shí)間。因此是否選擇使用遞歸算法取決于所解決的問題及應(yīng)用的場(chǎng)合。,3.7 函數(shù)的遞歸調(diào)用,【例3.15】采用遞推法求解Fibonacii數(shù)列,3.8 函數(shù)的一些高級(jí)議題,3.8.1 函數(shù)重載,3.8.2 缺省參數(shù),3.8.3 內(nèi)聯(lián)函數(shù),3.8.1 函數(shù)重載,重載的引入: 在C+中,如果需要定義幾個(gè)功能相似,而參數(shù)類型不同的函數(shù),那么這樣的幾個(gè)函數(shù)可以使用相同的函數(shù)名,這就是函數(shù)重載。 例: 求和函數(shù)對(duì)應(yīng)不同的參數(shù)類型
34、可以定義如下幾個(gè)重載函數(shù): int sum(int a,int b) double sum(double a,double b) float sum(float a,float b,float c),3.8.1 函數(shù)重載,重載匹配: 當(dāng)某個(gè)函數(shù)中調(diào)用到重載函數(shù)時(shí),編譯器會(huì)根據(jù)實(shí)參的類型去對(duì)應(yīng)地調(diào)用相應(yīng)的函數(shù)。匹配過程按如下步驟進(jìn)行: (1)如果有嚴(yán)格匹配的函數(shù),就調(diào)用該函數(shù); (2)參數(shù)內(nèi)部轉(zhuǎn)換后如果匹配,調(diào)用該函數(shù); (3)通過用戶定義的轉(zhuǎn)換尋求匹配。 因此在定義重載函數(shù)時(shí)必須保證參數(shù)類型不同,僅僅返回值類型不同是不行的。函數(shù)重載的好處在于,可以用相同的函數(shù)名來定義一組功能相同或類似的函數(shù),
35、程序的可讀性增強(qiáng)。,【例3.16】 重載函數(shù)的應(yīng)用,3.8.2 默認(rèn)參數(shù),默認(rèn)參數(shù)的引入: 默認(rèn)參數(shù)指在定義函數(shù)時(shí)為形參指定默認(rèn)值(缺省值)。這樣的函數(shù)在調(diào)用時(shí),對(duì)于默認(rèn)參數(shù),可以給出實(shí)參值,也可以不給出參數(shù)值。如果給出實(shí)參,將實(shí)參傳遞給形參進(jìn)行調(diào)用,如果不給出實(shí)參,則按默認(rèn)值進(jìn)行調(diào)用。,默認(rèn)參數(shù)的函數(shù)調(diào)用:默認(rèn)實(shí)參并不一定是常量表達(dá)式,可以是任意表達(dá)式,甚至可以通過函數(shù)調(diào)用給出。如果默認(rèn)實(shí)參是任意表達(dá)式,則函數(shù)每次被調(diào)用時(shí)該表達(dá)式被重新求值。但表達(dá)式必須有意義。,【例3.17】 默認(rèn)參數(shù),3.8.2 默認(rèn)參數(shù),使用要點(diǎn): 默認(rèn)參數(shù)可以有多個(gè),但所有默認(rèn)參數(shù)必須放在參數(shù)表的右側(cè),即先定義所有的
36、非默認(rèn)參數(shù),再定義默認(rèn)參數(shù)。這是因?yàn)樵诤瘮?shù)調(diào)用時(shí),參數(shù)自左向右逐個(gè)匹配,當(dāng)實(shí)參和形參個(gè)數(shù)不一致時(shí)只有這樣才不會(huì)產(chǎn)生二義性。,在同一個(gè)作用域中一個(gè)參數(shù)只能被指定一次默認(rèn)值,不可以在聲明和定義中同時(shí)指定默認(rèn)值,即使默認(rèn)值一樣也不行。 int fun2 (int, int =10, int =20); /函數(shù)聲明中給出缺省值。參數(shù)名也可省略 void fun1() int fun2(int a, int b, int c) /定義中不再給出缺省值 習(xí)慣上,缺省參數(shù)在公共頭文件包含的函數(shù)聲明中指定,否則缺省實(shí)參只能用于包含該函數(shù)定義的文件中的函數(shù)調(diào)用。,3.8.3 內(nèi)聯(lián)函數(shù),內(nèi)聯(lián)函數(shù)的引入: 當(dāng)程序執(zhí)
37、行函數(shù)調(diào)用時(shí),系統(tǒng)要建立??臻g,保護(hù)現(xiàn)場(chǎng),傳遞參數(shù)以及控制程序執(zhí)行的轉(zhuǎn)移等等,這些工作需要系統(tǒng)時(shí)間和空間的開銷。 當(dāng)函數(shù)功能簡(jiǎn)單,使用頻率很高,為了提高效率,直接將函數(shù)的代碼嵌入到程序中。但這個(gè)辦法有缺點(diǎn),一是相同代碼重復(fù)書寫,二是程序可讀性往往沒有使用函數(shù)的好。 為了協(xié)調(diào)好效率和可讀性之間的矛盾,C+提供了另一種方法,即定義內(nèi)聯(lián)函數(shù),方法是在定義函數(shù)時(shí)用修飾詞inline。,3.8.3 內(nèi)聯(lián)函數(shù),請(qǐng)看如下程序段,讀入一行字符串,逐個(gè)判斷是否為數(shù)字字符: inline int IsNumber(char ch) return ch=0 因使用頻度很高,說明為內(nèi)聯(lián)函數(shù)。,3.8.3 內(nèi)聯(lián)函數(shù),內(nèi)
38、聯(lián)函數(shù)的調(diào)用機(jī)制與一般函數(shù)不同,編譯器在編譯過程中遇到inline時(shí),為該函數(shù)建立一段代碼,而后在每次調(diào)用時(shí)直接將該段代碼嵌入到調(diào)用函數(shù)中,從而將函數(shù)調(diào)用方式變?yōu)轫樞驁?zhí)行方式,這一過程稱為內(nèi)聯(lián)函數(shù)的擴(kuò)展或內(nèi)聯(lián)。 因inline指示符對(duì)編譯器而言只是一個(gè)建議,編譯器也可以選擇忽略該建議。,3.9 頭文件與多文件結(jié)構(gòu) (選讀),3.9.1 頭文件,標(biāo)準(zhǔn)庫頭文件: 考慮標(biāo)識(shí)符在其他文件中的可見性。使用頭文件是很有效的方法。如: #include using namespace std; 其中iostream是在標(biāo)準(zhǔn)名字空間域std中定義的頭文件。對(duì)應(yīng)的傳統(tǒng)方式的文件名為,頭文件以“.h”為后綴。 系
39、統(tǒng)定義的頭文件中定義了一些常用的公用標(biāo)識(shí)符和函數(shù),用戶只要將頭文件包含進(jìn)自己的文件,就可使頭文件中定義的標(biāo)識(shí)符在用戶文件中變得可見,也就可以直接使用頭文件中定義的標(biāo)識(shí)符和函數(shù)。,3.9.1 頭文件,自定義頭文件: 除了系統(tǒng)定義的頭文件外,用戶還可以自定義頭文件。對(duì)于具有外部存儲(chǔ)類型的標(biāo)識(shí)符,可以在其他任何一個(gè)源程序文件中經(jīng)聲明后引用,因此用戶完全可以將一些具有外部存儲(chǔ)類型的標(biāo)識(shí)符的聲明放在一個(gè)頭文件中。具體地說,頭文件中可以包括:用戶構(gòu)造的數(shù)據(jù)類型(如枚舉類型),外部變量,外部函數(shù)、常量和內(nèi)聯(lián)函數(shù)等具有一定通用性或常用的量,而一般性的變量和函數(shù)定義不宜放在頭文件中。,3.9.2 多文件結(jié)構(gòu),在
40、開發(fā)較大程序時(shí),通常將其分解為多個(gè)源程序文件,每個(gè)較小的程序用一個(gè)源程序文件建立。程序經(jīng)過建立、編譯、連接,成為一個(gè)完整的可執(zhí)行程序。多文件結(jié)構(gòu)通過工程進(jìn)行管理,在工程中建立若干用戶定義的頭文件.h和源程序文件.cpp。頭文件中定義用戶自定義的數(shù)據(jù)類型,所有的程序?qū)崿F(xiàn)則放在不同的源程序文件中。編譯時(shí)每個(gè)源程序文件單獨(dú)編譯,如果源程序文件中有編譯預(yù)處理指令,則首先經(jīng)過編譯預(yù)處理生成臨時(shí)文件存放在內(nèi)存,之后對(duì)臨時(shí)文件進(jìn)行編譯生成目標(biāo)文件.obj,編譯后臨時(shí)文件撤銷。所有的目標(biāo)文件經(jīng)連接器連接最終生成一個(gè)完整的可執(zhí)行文件.exe。 圖3.11是一個(gè)多文件系統(tǒng)的開發(fā)過程。,3.9.2 多文件結(jié)構(gòu),編譯
41、,預(yù)編譯,編譯,預(yù)編譯,預(yù)編譯,編譯,圖3.11 C+程序開發(fā)過程,3.10 編譯預(yù)處理(選讀),3.10.1 宏定義指令,3.10.2 文件包含指令,3.10.3 條件編譯指令,3.10.1 宏定義指令,1 不帶參宏定義 用來產(chǎn)生與一個(gè)字符串對(duì)應(yīng)的常量字符串,格式為: #define 宏名 常量串 預(yù)處理后文件中凡出現(xiàn)該字符串處均用其對(duì)應(yīng)的常量串代替。替換過程稱為宏替換或宏展開。例如,如果使用指令 #define PI 3.1415926 則程序中可以使用標(biāo)識(shí)符PI,編譯預(yù)處理后產(chǎn)生一個(gè)中間文件,文件中所有PI被替換為3.1415926。 宏替換只是字符串和標(biāo)識(shí)符之間的簡(jiǎn)單替換,預(yù)處理本身不
42、做任何數(shù)據(jù)類型和合法性檢查,也不分配內(nèi)存單元。,3.10.1 宏定義指令,2 帶參數(shù)的宏定義 帶參宏定義的形式很象定義一個(gè)函數(shù),格式為: #define 宏名 ( 形參表 ) 表達(dá)式串 例如作如下宏定義: #define S(a,b) (a)*(b)/2 程序中可使用S(a,b),預(yù)處理后產(chǎn)生中間文件,其中S(a,b)被替換成(a)*(b)/2。注意,宏定義形參通常要用括號(hào)括起來,否則容易導(dǎo)致邏輯錯(cuò)誤。例如,如果定義: #define S(a,b) a*b/2 那么程序中的S(3+5,4+2)就會(huì)被宏展開為3+5*4+2/2,不符合定義的真正的意圖。 帶參宏定義形式上象定義函數(shù),但它與函數(shù)的本
43、質(zhì)不同,宏定義仍然只是產(chǎn)生字符串替代,不存在分配內(nèi)存和參數(shù)傳遞。,3.10.2 文件包含指令,文件包含用#include指令,預(yù)處理后將指令中指明的源程序文件嵌入到當(dāng)前源程序文件的指令位置處。格式為: #include 或 #include 文件名 第一種方式稱為標(biāo)準(zhǔn)方式,預(yù)處理器將在include子目錄下搜索由文件名所指明的文件。這種方式適用于嵌入C+提供的頭文件,因?yàn)檫@些頭文件一般都存在C+系統(tǒng)目錄的include子目錄下。而第二種方式編譯器將首先在當(dāng)前文件所在目錄下搜索,如果找不到再按標(biāo)準(zhǔn)方式搜索。這種方式適用于嵌入用戶自己建立的頭文件。,一個(gè)被包含的頭文件中還可以有#include指令
44、,即include指令可以嵌套,但是,如果同一個(gè)頭文件在同一個(gè)源程序文件中被重復(fù)包含,就會(huì)出現(xiàn)標(biāo)識(shí)符重復(fù)定義的錯(cuò)誤。例如:頭文件f2.h中包含了f1.h,如果文件f3.cpp中既包含f1.h,又包含f2.h,那么編譯將提示錯(cuò)誤,原因是f1.h被包含了兩次,那么其中定義的標(biāo)識(shí)符在f3.cpp中就被重復(fù)定義。避免重復(fù)包含可以用條件編譯指令。,3.10.2 文件包含指令,3.10.3 條件編譯指令,1 用宏名作為編譯的條件 格式為: #ifdef #else #endif,2 表達(dá)式的值作為編譯條件 格式為: #if #else #endif,當(dāng)希望在不同條件下編譯程序的不同部分。這種情況就要使用條
45、件編譯指令。,其中程序段可以是程序也可以是編譯預(yù)處理指令。可以通過在該指令前面安排宏定義來控制編譯不同的程序段。,例:在調(diào)試程序時(shí)常常要輸出調(diào)試信息,而調(diào)試完后不需要輸出這些信息,則可以把輸出調(diào)試信息的語句用條件編譯指令括起來。形式如下: #ifdef DEBUG cout a=atx=xendl; #endif 在程序調(diào)試期間,在該條件編譯指令前增加宏定義: #define DEBUG 調(diào)試好后,刪除DEBUG宏定義,將源程序重新編譯一次。,條件編譯指令包括:#if、#else、#ifdef、#ifndef、#endif、#undef等。 #ifndef與#ifdef作用一樣,只是選擇的條件
46、相反。 #undef指令用來取消#define指令所定義的符號(hào),這樣可以根據(jù)需要打開和關(guān)閉符號(hào)。,第三章 函數(shù),再見,謝謝!,3.1.3 函數(shù)的調(diào)用【例3.1】,main( )函數(shù),調(diào)用max(2.5,4.7 ),函數(shù)max(2.5,4.7 ),return 4.7,主程序后續(xù)語句,【例3.1】 輸入兩個(gè)實(shí)數(shù),輸出其中較大的數(shù)。其中求兩個(gè)實(shí)數(shù)中的較大數(shù)用函數(shù)完成。 程序如下: #include using namespace std; float max(float a,float b) return(a=b?a:b); int main() float x,y; coutxy; coutx和
47、y中較大數(shù)為max(x,y)endl; return 0; ,3.2.1 函數(shù)的參數(shù)傳遞及傳值調(diào)用【例3.2】,調(diào)用power(4.6,3 ),函數(shù)power(4.6,3 ),return 97.336,主程序后續(xù)語句,【例3.2】 實(shí)參和形參對(duì)應(yīng)關(guān)系的示例。 float power(float x,int n) /求x的n次冪 float p=1; while(n-) p*=x; return p; int main() int n=3; float x=4.6; char c=a; coutpower(x,n)=power(x,n)endl; coutpower(c,n)=power(c,
48、n)endl; coutpower(n,x)=power(n,x)endl; return 0;,3.2.1 函數(shù)的參數(shù)傳遞及傳值調(diào)用【例3.2】,調(diào)用power(a,3 ),函數(shù)power(97,3 ),return 912673,主程序后續(xù)語句,【例32】 實(shí)參和形參對(duì)應(yīng)關(guān)系。 float power(float x,int n) /求x的n次冪 float p=1; while(n-) p*=x; return p; int main() int n=3; float x=4.6; char c=a; coutpower(x,n)=power(x,n)endl; coutpower(c,
49、n)=power(c,n)endl; coutpower(n,x)=power(n,x)endl; return 0;,3.2.1 函數(shù)的參數(shù)傳遞及傳值調(diào)用【例3.2】,調(diào)用power(3,4.6 ),函數(shù)power(3,4),return 81,主程序后續(xù)語句,【例32】 實(shí)參和形參對(duì)應(yīng)關(guān)系。 float power(float x,int n) /求x的n次冪 float p=1; while(n-) p*=x; return p; int main() int n=3; float x=4.6; char c=a; coutpower (x,n)=power(x,n)endl; cout
50、power (c,n)=power(c,n)endl; coutpower (n,x)=power(n,x)endl; return 0;,【例3.3】程序: float TriangleArea(float a, float b, float c) if (a+babc; area=TriangleArea(a,b,c); if(area=-1) cout(a,b, c )不能構(gòu)成三角形!endl; elsecout三角形(a,b,c )面積為:areaendl; return 0;,bool palindrome(int); /函數(shù)聲明 int main() int m; coutsetw
51、(10)msetw(20)m*m“ setw(20)m*m*mendl; for(m=11;m1000;m+) if(palindrome(m) ,【例3.4】 輸出回文數(shù),bool palindrome(int n)/判斷回文數(shù) int digit10; int m=n,i=0,j; do digiti=n%10; n/=10;i+; while(n0); for(j=0;ji;j+) n=n*10+digitj; return (n=m); ,【例3.4】 輸出回文數(shù),3.3.2 全局變量【例3.5】,打印 200,調(diào)用 func( ),函數(shù) func( ),200*2 =400,打印 4
52、00,n=100,n=100*2 =200,【例3.5】 多個(gè)函數(shù)使用全局變量的例子。 int n=100; void func() n*=2; int main() n*=2; coutnendl; func(); coutnendl; return 0;,3.3.3 局部變量,打印main()中的t=3.5,調(diào)用 fun( ),函數(shù) fun( ),打印fun()中的t=5,打印main()中的t=3.5,t = 5,【例3.6】 使用局部變量的例子。 void fun() auto int t=5; / fun()中的局部變量,auto可省略 coutfun()中的t=tendl; int
53、 main() float t=3.5; /main()函數(shù)中的局部變量 coutmain()中的t=tendl; fun(); coutmain()中的t=tendl; return 0;,塊域【例3.7】,3,5,a=3 b=5,a=5 b=3,【例3.7】 輸入兩數(shù),按從大到小的順序保存,并輸出結(jié)果。,結(jié)果,棧,t,= 3,int main() int a,b; /具有函數(shù)域 coutab; cout=a) int t; /具有塊域 t=a; a=b; b=t; /交換a,b的值 couta=atb=bendl; return 0;,上述程序若在最后一個(gè)cout語句處增加: coutte
54、ndl; 則編譯時(shí)會(huì)提示錯(cuò)誤,因?yàn)樽兞縯的作用域只在if語句中,其它地方不可見。,【例3.8】設(shè)計(jì)函數(shù)完成兩數(shù)交換,用主函數(shù)進(jìn)行測(cè)試。 void swap(int,int); int main() int a,b; /a,b作用域?yàn)閙ain() coutab; cout調(diào)用前:實(shí)參a=a,b=bendl; swap(a,b); /傳值 cout調(diào)用后:實(shí)參a=a,b=bendl; return 0; void swap(int a,int b) /a,b作用域?yàn)閟wap() cout調(diào)用中endl; cout交換前:形參a=a,b=bendl; int t; t=a; a=b; b=t;/交換
55、swap()中的a,b的值 cout交換后:形參a=a,b=bendl;,200 300,內(nèi) i= 500,內(nèi) j= 600,內(nèi)n=500+600 =1100,1100 500 600,100,200+300=500,500,500 200 300,外部 i=200,外部 j=300,【例3.9】 顯示同名變量可見性。 int n=100; #include int main() int i=200,j=300; cout ntitjendl; /內(nèi)部塊 int i=500,j=600,n; n=i+j; cout ntitj endl; /輸出局部變量n cout:nendl;/輸出全局變量
56、n n=i+j;/修改全局變量 cout ntitj endl; return 0;,【例3.10】 自動(dòng)變量與局部靜態(tài)變量的區(qū)別 int st() static int t=100; /局部靜態(tài)變量 t+; return t; int at() int t=100; /自動(dòng)變量 t+;return t; int main() int i; for(i=0;i5;i+) coutat()t; coutendl; for(i=0;i5;i+) coutst()t; coutendl; return 0;,3.6.1 存儲(chǔ)類型,1,2,3,4,5,101,101,101,101,101,3.6.1 存儲(chǔ)類型,1,2,101,3,4,5,102,103,104,105,【例3.10】 自動(dòng)變量與局部靜態(tài)變量的區(qū)別 int st() static int t=100; /局部靜態(tài)變量 t+; return t; int at() int t=100; /自動(dòng)變量 t+;return t; int main() int i; for(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年中國(guó)郵政儲(chǔ)蓄銀行股份有限公司普洱市分行招聘見習(xí)人員(10人)參考考試題庫附答案解析
- 塑膠顏料生產(chǎn)管理制度
- 企業(yè)安全生產(chǎn)變更制度
- 食品生產(chǎn)經(jīng)營(yíng)記錄制度
- 養(yǎng)雞場(chǎng)生產(chǎn)安全管理制度
- 2026浙江臺(tái)州市溫嶺市濱海交警中隊(duì)面向社會(huì)招聘警務(wù)輔助人員1人備考考試題庫附答案解析
- 安全生產(chǎn)宣教工作制度
- 豐田CE生產(chǎn)制度
- 安全生產(chǎn)專家檢查制度
- 旅館安全生產(chǎn)管理制度
- 保利入職培訓(xùn)
- 2023年福建省能源石化集團(tuán)有限責(zé)任公司社會(huì)招聘筆試真題
- 牛羊肉精深加工項(xiàng)目可行性研究報(bào)告
- 普通國(guó)省道養(yǎng)護(hù)工程(線預(yù)防養(yǎng)護(hù))設(shè)計(jì)說明
- FZT 43046-2017 錦綸彈力絲織物
- 無人駕駛(從想象到現(xiàn)實(shí))
- 貨物供應(yīng)方案及運(yùn)輸方案
- 三片罐行業(yè)分析
- 道德經(jīng)和道家智慧課件
- 中國(guó)家庭金融調(diào)查報(bào)告
- 高中數(shù)學(xué)人教A版(2019)選擇性必修第三冊(cè)教材解讀與教學(xué)分析 課件-2023年高中數(shù)學(xué)新教材培訓(xùn)
評(píng)論
0/150
提交評(píng)論