第08章函數(shù)PPT課件_第1頁
第08章函數(shù)PPT課件_第2頁
第08章函數(shù)PPT課件_第3頁
第08章函數(shù)PPT課件_第4頁
第08章函數(shù)PPT課件_第5頁
已閱讀5頁,還剩119頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、本章要點(diǎn)第1頁/共124頁 8.1 8.1 概述概述 8. 8.函數(shù)定義的一般形式函數(shù)定義的一般形式 8. 8.函數(shù)參數(shù)和函數(shù)的值函數(shù)參數(shù)和函數(shù)的值 8. 8. 函數(shù)的調(diào)用函數(shù)的調(diào)用 8. 8. 函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用 8. 8.函數(shù)的遞歸調(diào)用函數(shù)的遞歸調(diào)用 8. 8.數(shù)組作為函數(shù)參數(shù)數(shù)組作為函數(shù)參數(shù) 8.8 8.8 局部變量和全局變量局部變量和全局變量 8. 8.變量的存儲(chǔ)類別變量的存儲(chǔ)類別 8.10 8.10 內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和外部函數(shù)第2頁/共124頁8.1概述概述 一個(gè)較大的程序可分為若干個(gè)程序程序模塊模塊,每一個(gè)模塊用來實(shí)現(xiàn)一個(gè)特定的功能。在高級(jí)語言中用子程序子程序?qū)?/p>

2、現(xiàn)模塊的功能。子程序由函數(shù)來完成。一個(gè)程序可由一個(gè)主函數(shù)和若干個(gè)其他函數(shù)構(gòu)成。由主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用。同一個(gè)函數(shù)可以被一個(gè)或多個(gè)由主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用。同一個(gè)函數(shù)可以被一個(gè)或多個(gè)函數(shù)調(diào)用任意多次。函數(shù)調(diào)用任意多次。函數(shù)間的調(diào)用關(guān)系函數(shù)間的調(diào)用關(guān)系第3頁/共124頁# include void main()void printstar( ); /*對(duì)printstar函數(shù)聲明*/ void print_message( ); /*對(duì)print_message函數(shù)聲明*/ printstar( ); *調(diào)用printstar函數(shù)* print_messa

3、ge( ); /*調(diào)用print_message函數(shù)*/ printstar( ); *調(diào)用printstar函數(shù)*/ 例8.18.1第4頁/共124頁void printstar( ) *定義printstar函數(shù)* printf(* * * * * * * * * * * * * * * *n);void print_message( ) *定義print_message函數(shù)* printf(How do you do!n); 運(yùn)行情況如下:* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *How do you d

4、o!How do you do!* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *第5頁/共124頁(1 1)一個(gè)程序由一個(gè)或多個(gè)程序模塊組成,每一個(gè)程序模塊作為一個(gè)源程序文件。對(duì)較大的程序,一般不希望把所有內(nèi)容全放在一個(gè)文件中,而是將他們分別放在若干個(gè)源文件中,再由若干源程序文件組成一個(gè)C程序。這樣便于分別編寫、分別編譯,提高調(diào)試效率。一個(gè)源程序文件可以為多個(gè)C程序公用。第6頁/共124頁(2 2) 一個(gè)源程序文件由一個(gè)或多個(gè)函數(shù)以及其他有關(guān)內(nèi)容(如命令行、數(shù)據(jù)定義等)組成。一個(gè)源程序文件是一個(gè)編譯單位,在程序編譯時(shí)

5、是以源程序文件為單位進(jìn)行編譯的,而不是以函數(shù)為單位進(jìn)行編譯的。 (3 3)程序的執(zhí)行是從函數(shù)開始的,在函數(shù)中調(diào)用其他函數(shù),在調(diào)用后流程返回到函數(shù),在函數(shù)中結(jié)束整個(gè)程序的運(yùn)行。 第7頁/共124頁(4 4) 所有函數(shù)都是平行的,即在定義函數(shù)時(shí)是分別進(jìn)行的,是互相獨(dú)立的。一個(gè)函數(shù)并不從屬于另一函數(shù),即函數(shù)不能嵌套定義。函數(shù)間可以互相調(diào)用,但不能調(diào)用函數(shù)。函數(shù)是系統(tǒng)調(diào)用的。 第8頁/共124頁(5 5)從用戶使用的角度看,函數(shù)有兩種: 標(biāo)準(zhǔn)函數(shù),即庫函數(shù)。這是由系統(tǒng)提供的,用戶不必自己定義這些函數(shù),可以直接使用它們。應(yīng)該說明,不同的C系統(tǒng)提供的庫函數(shù)的數(shù)量和功能會(huì)有一些不同,當(dāng)然許多基本的函數(shù)是共同

6、的。 用戶自己定義的函數(shù)。用以解決用戶的專門需要。 第9頁/共124頁(6 6) 從函數(shù)的形式看,函數(shù)分兩類: 無參函數(shù)。如例8.1中的printstarprintstar和print_message就是無參函數(shù)。在調(diào)用無參函數(shù)時(shí),主調(diào)函數(shù)不向被調(diào)用函數(shù)傳遞數(shù)據(jù)。無參函數(shù)一般用來執(zhí)行指定的一組操作。例如,例8程序中的printstar函數(shù)。有參函數(shù)。在調(diào)用函數(shù)時(shí),主調(diào)函數(shù)在調(diào)用被調(diào)用函數(shù)時(shí),通過參數(shù)向被調(diào)用函數(shù)傳遞數(shù)據(jù),一般情況下,執(zhí)行被調(diào)用函數(shù)時(shí)會(huì)得到一個(gè)函數(shù)值,供主調(diào)函數(shù)使用。 第10頁/共124頁定義無參函數(shù)的一般形式為:類型標(biāo)識(shí)符函數(shù)名() 聲明部分 語句部分 在定義函數(shù)時(shí)要用“類型標(biāo)

7、識(shí)符”指定函數(shù)值的類型,即函數(shù)帶回來的值的類型。例8.中的printstar和print_message函數(shù)為void類型,表示不需要帶回函數(shù)值。 第11頁/共124頁定義有參函數(shù)的一般形式為:類型標(biāo)識(shí)符函數(shù)名(形式參數(shù)表列) 聲明部分 語句部分 例如: (int ,int ) ;/ *函數(shù)體中的聲明部分* ?; (); 第12頁/共124頁定義空函數(shù)的一般形式為:類型標(biāo)識(shí)符函數(shù)名() 例如:() 調(diào)用此函數(shù)時(shí),什么工作也不做,沒有任何實(shí)際作用。在主調(diào)函數(shù)中寫上“();”表明“這里要調(diào)用一個(gè)函數(shù)”,而現(xiàn)在這個(gè)函數(shù)沒有起作用,等以后擴(kuò)充函數(shù)功能時(shí)補(bǔ)充上。 第13頁/共124頁在前面提到的有參函數(shù)

8、中,在定義函數(shù)時(shí)函數(shù)名后面括弧中的變量名稱為“形式參數(shù)”(簡稱“形參”),在主調(diào)函數(shù)中調(diào)用一個(gè)函數(shù)時(shí),函數(shù)名后面括弧中的參數(shù)(可以是一個(gè)表達(dá)式)稱為“實(shí)際參數(shù)”(簡稱“實(shí)參”)。return后面的括弧中的值()作為函數(shù)帶回的值(稱函數(shù)返回值)。 第14頁/共124頁在不同的函數(shù)之間傳遞數(shù)據(jù),可以使用的法:參數(shù):通過形式參數(shù)和實(shí)際參數(shù)返回值:用return語句返回計(jì)算結(jié)果全局變量:外部變量大多數(shù)情況下,主調(diào)函數(shù)和被調(diào)用函數(shù)之間有數(shù)據(jù)傳遞的關(guān)系。第15頁/共124頁#include #include void main( )void main( ) int max(int int max(int

9、,int int ) ); / /* * 對(duì)函數(shù)的聲明 * */ / int int ,; scanfscanf(“,”,); max(max(,) );/* 對(duì)函數(shù)的調(diào)用 */ printf( printf(ax is ax is ,); 例8.8.調(diào)用函數(shù)時(shí)的數(shù)據(jù)傳遞 int max(int int max(int ,int int ) ) /* 函數(shù)的定義 */ int int ; ?; returnreturn(); 第16頁/共124頁通過函數(shù)調(diào)用,使兩個(gè)函數(shù)中的數(shù)據(jù)發(fā)生聯(lián)系通過函數(shù)調(diào)用,使兩個(gè)函數(shù)中的數(shù)據(jù)發(fā)生聯(lián)系 第17頁/共124頁關(guān)于形參與實(shí)參的說明:關(guān)于形參與實(shí)參的說明:(1

10、) 在定義函數(shù)中指定的形參,在未出現(xiàn)函數(shù)調(diào)用時(shí),它們并不占內(nèi)存中的存儲(chǔ)單元。只有在發(fā)生函數(shù)調(diào)用時(shí),函數(shù)中的形參才被分配內(nèi)存單元。在調(diào)用結(jié)束后,形參所占的內(nèi)存單元也被釋放。(2) 實(shí)參可以是常量、變量或表達(dá)式,如: (,);但要求它們有確定的值。在調(diào)用時(shí)將實(shí)參的值賦給形參。第18頁/共124頁(3) 在被定義的函數(shù)中,必須指定形參的類型。(4) 實(shí)參與形參的類型應(yīng)相同或賦值兼容。例8中實(shí)參和形參都是整型。如果實(shí)參為整型而形參x為實(shí)型,或者相反,則按第3章介紹的不同類型數(shù)值的賦值規(guī)則進(jìn)行轉(zhuǎn)換。例如實(shí)參值a為3.5,而形參x為整型,則將實(shí)數(shù)3.5轉(zhuǎn)換成整數(shù)3,然后送到形參x。字符型與整型可以互相通用

11、。第19頁/共124頁(5) 在語言中,實(shí)參向?qū)π螀⒌臄?shù)據(jù)傳遞是“值傳遞”,單向傳遞,只由實(shí)參傳給形參,而不能由形參傳回來給實(shí)參。在內(nèi)存中,實(shí)參單元與形參單元是不同的單元。 第20頁/共124頁在調(diào)用函數(shù)時(shí),給形參分配存儲(chǔ)單元,并將實(shí)參對(duì)應(yīng)的值傳遞給形參,調(diào)用結(jié)束后,形參單元被釋放,實(shí)參單元仍保留并維持原值。因此,在執(zhí)行一個(gè)被調(diào)用函數(shù)時(shí),形參的值如果發(fā)生改變,并不會(huì)改變主調(diào)函數(shù)的實(shí)參的值。例如,若在執(zhí)行函數(shù)過程中和的值變?yōu)楹?,而和仍為和。?1頁/共124頁通常,希望通過函數(shù)調(diào)用使主調(diào)函數(shù)能得到一個(gè)確定的值,這就是函數(shù)的返回值。例如,例8.中,(,)的值是,(,)的值是5。賦值語句將這個(gè)函數(shù)值

12、賦給變量。 關(guān)于函數(shù)返回值的一些說明:關(guān)于函數(shù)返回值的一些說明: (1)(1)函數(shù)的返回值是通過函數(shù)中的函數(shù)的返回值是通過函數(shù)中的returnreturn語句獲語句獲得的。得的。第22頁/共124頁如果需要從被調(diào)用函數(shù)帶回一個(gè)函數(shù)值供主調(diào)函數(shù)使用,被調(diào)用函數(shù)中必須包含return語句。如果不需要從被調(diào)用函數(shù)帶回函數(shù)值可以不要return語句。 一個(gè)函數(shù)中可以有一個(gè)以上的return語句,執(zhí)行到哪一個(gè)return語句,哪一個(gè)語句起作用。return語句后面的括弧也可以不要,如如: : “return ; ;” 等價(jià)于等價(jià)于 “return ();();” return語句將被調(diào)用函數(shù)中的一個(gè)確定

13、值帶回主調(diào)函數(shù)中去。見圖8.2中從return語句返回的箭頭。第23頁/共124頁return后面的值可以是一個(gè)表達(dá)式。例如,例8中的函數(shù)可以改寫成:(int ,int )(? );); (2)(2) 函數(shù)的返回值應(yīng)當(dāng)屬于某一個(gè)確定的類型,函數(shù)的返回值應(yīng)當(dāng)屬于某一個(gè)確定的類型,在定義函數(shù)時(shí)指定函數(shù)返回值的類型在定義函數(shù)時(shí)指定函數(shù)返回值的類型。 第24頁/共124頁例如例如: :下面是下面是3 3個(gè)函數(shù)的首行:個(gè)函數(shù)的首行:int max(float ,float ) /* 函數(shù)值為整型 */char letter(char c1,char c2) /* 函數(shù)值為字符型 */ double mi

14、n(int ,int ) /* 函數(shù)值為雙精度型 */在語言中,凡不加類型說明的函數(shù),自動(dòng)按整型處理。例8.中的函數(shù)首行的函數(shù)類型int可以省寫,用Turbo C 2.0編譯程序時(shí)能通過,但用Turbo C 3.0編譯程序時(shí)不能通過,因?yàn)镃+要求所有函數(shù)都必須指定函數(shù)類型。因此,建議在定義時(shí)對(duì)所有函數(shù)都指定函數(shù)類型。 第25頁/共124頁(3 3)在定義函數(shù)時(shí)指定的函數(shù)類型一般應(yīng)該和在定義函數(shù)時(shí)指定的函數(shù)類型一般應(yīng)該和returnreturn語句中的表達(dá)式類型一致。語句中的表達(dá)式類型一致。如果函數(shù)值的類型和如果函數(shù)值的類型和return語句中表達(dá)式的值不一致,則以函數(shù)類型為準(zhǔn)。語句中表達(dá)式的值

15、不一致,則以函數(shù)類型為準(zhǔn)。對(duì)數(shù)值型數(shù)據(jù),可以自動(dòng)進(jìn)行類型轉(zhuǎn)換。即函數(shù)類型決定返回值的類型。 (4 4)對(duì)于不帶回值的函數(shù),應(yīng)當(dāng)用對(duì)于不帶回值的函數(shù),應(yīng)當(dāng)用“voidvoid”定定義函數(shù)為義函數(shù)為“無類型無類型”(或稱(或稱“空類型空類型”)。這)。這樣,系統(tǒng)就保證不使函數(shù)帶回任何值,即禁止樣,系統(tǒng)就保證不使函數(shù)帶回任何值,即禁止在調(diào)用函數(shù)中使用被調(diào)用函數(shù)的返回值。在調(diào)用函數(shù)中使用被調(diào)用函數(shù)的返回值。第26頁/共124頁例例 8.8. 返回值類型與函數(shù)類型不同返回值類型與函數(shù)類型不同 # include void main() int (float ,float ); float ,; int

16、; scanf(,); (,); printf( ,); int max(float ,float ) float ; /* z為實(shí)型變量 */ ? ; return(); 運(yùn)行情況如下:, Max is 第27頁/共124頁 函數(shù)調(diào)用的一般形式為: : 函數(shù)名(實(shí)參表列)如果實(shí)參表列包含多個(gè)實(shí)參,則各參數(shù)間用逗號(hào)隔開。實(shí)參與形參的個(gè)數(shù)應(yīng)相等,類型應(yīng)匹配。實(shí)參與形參按順序?qū)?yīng),一一傳遞數(shù)據(jù)。如果是調(diào)用無參函數(shù),則“實(shí)參表列”可以沒有,但括弧不能省略。第28頁/共124頁函數(shù)語句(無返回值的函數(shù))把函數(shù)調(diào)用作為一個(gè)語句。如例8.1中的printstar(),這時(shí)不要求函數(shù)帶回值,只要求函數(shù)完成一

17、定的操作。函數(shù)表達(dá)式(有返回值的函數(shù))函數(shù)出現(xiàn)在一個(gè)表達(dá)式中,這種表達(dá)式稱為函數(shù)表達(dá)式。這時(shí)要求函數(shù)帶回一個(gè)確定的值以參加表達(dá)式的運(yùn)算。例如:* *(,);第29頁/共124頁函數(shù)參數(shù)(有返回值的函數(shù))函數(shù)調(diào)用作為一個(gè)函數(shù)的實(shí)參。例如:m = max (a , max ( b , c ) ) ;其中max ( b , c )是一次函數(shù)調(diào)用,它的值作為max另一次調(diào)用的實(shí)參。m的值是a、b、c三者中的最大者。又如: printf (%d, max (a,b);也是把max ( a , b )作為printf函數(shù)的一個(gè)參數(shù)。函數(shù)調(diào)用作為函數(shù)的參數(shù),實(shí)質(zhì)上也是函數(shù)表達(dá)式形式調(diào)用的一種,因?yàn)楹瘮?shù)的參數(shù)

18、本來就要求是表達(dá)式形式。第30頁/共124頁(1) 首先被調(diào)用的函數(shù)必須是已經(jīng)存在的函數(shù)(是庫函數(shù)或用戶自己定義的函數(shù))。但光有這一條件還不夠。第31頁/共124頁(3) 如果使用用戶自己定義的函數(shù),而該函數(shù)的位置在調(diào)用它的函數(shù)(即主調(diào)函數(shù))的后面(在同一個(gè)文件中),應(yīng)該在主調(diào)函數(shù)中對(duì)被調(diào)用的函數(shù)作聲明。(2) 如果使用庫函數(shù),還應(yīng)該在本文件開頭用命令將調(diào)用有關(guān)庫函數(shù)時(shí)所需用到的信息“包含”到本文件中來。 第32頁/共124頁函數(shù)原型的一般形式為(1)(1) 函數(shù)類型 函數(shù)名( (參數(shù)類型1 1,參數(shù)類型2)2);(2)(2) 函數(shù)類型 函數(shù)名( (參數(shù)類型1 1 參數(shù)名1 1,參數(shù)類型2 2

19、 參數(shù)名2)2); 第33頁/共124頁“聲明”一詞的原文是declaration,過去在許多書中把它譯為“說明”。聲明的作用是把函數(shù)名、函數(shù)參數(shù)的個(gè)數(shù)和參數(shù)類型等信息通知編譯系統(tǒng),以便在遇到函數(shù)調(diào)用時(shí),編譯系統(tǒng)能正確識(shí)別函數(shù)并檢查調(diào)用是否合法。 (例如函數(shù)名是否正確,實(shí)參與形參的類型和個(gè)數(shù)是否一致)。 第34頁/共124頁注意:函數(shù)的“定義”和“聲明”不是一回事。函數(shù)的定義是指對(duì)函數(shù)功能的確立,包括指定函數(shù)名,函數(shù)值類型、形參及其類型、函數(shù)體等,它是一個(gè)完整的、獨(dú)立的函數(shù)單位。而函數(shù)的聲明的作用則是把函數(shù)的名字、函數(shù)類型以及形參的類型、個(gè)數(shù)和順序通知編譯系統(tǒng),以便在調(diào)用該函數(shù)時(shí)系統(tǒng)按此進(jìn)行對(duì)

20、照檢查。 第35頁/共124頁# include void main() float add(float x, float y); *對(duì)被調(diào)用函數(shù)add的聲明* float a,b,c; scanf(f,f,a,b); cadd(a,b); *調(diào)用函數(shù)add* printf(“sum is f n”,c);float add(float ,float )*函數(shù)add的定義* float ; /* 函數(shù)體 */ z; return(z); 例8 對(duì)被調(diào)用的函數(shù)作聲明第36頁/共124頁如果 被調(diào)用函數(shù)的定義出現(xiàn)在主調(diào)函數(shù)之前,可以不必加以聲明。因?yàn)榫幾g系統(tǒng)已經(jīng)先知道了已定義函數(shù)的有關(guān)情況,會(huì)根據(jù)

21、函數(shù)首部提供的信息對(duì)函數(shù)的調(diào)用作正確性檢查。 如果 被調(diào)函數(shù)的定義出現(xiàn)在主調(diào)函數(shù)之前,可以不必加以聲明。因?yàn)榫幾g系統(tǒng)已經(jīng)先知道了已定義函數(shù)的有關(guān)情況,會(huì)根據(jù)函數(shù)首部提供的信息對(duì)函數(shù)的調(diào)用作正確性檢查。 第37頁/共124頁改寫例 8.# include float add(float ,float ) *函數(shù)首部* float ; /* 函數(shù)體 */ z; return(z); void main() float a,b,c; scanf(f,f,a,b); cadd(a,b); printf(sum is f n,c);第38頁/共124頁對(duì)被調(diào)函數(shù)的聲明也可出現(xiàn)在所有函數(shù)之前# inclu

22、de float add(float x, float y); *對(duì)被調(diào)用函數(shù)add的聲明*void main() float a,b,c; scanf(f,f,a,b); cadd(a,b); *調(diào)用函數(shù)add* printf(“sum is f n”,c);float add(float ,float )*函數(shù)add的定義* float ; /* 函數(shù)體 */ z; return(z); 第39頁/共124頁如果被調(diào)函數(shù)的類型為int,C語言允許在調(diào)用函數(shù)前不必作函數(shù)聲明# include void main() int a,b,c; scanf(d,d,a,b); cadd(a,b);

23、*調(diào)用函數(shù)add* printf(“sum is d n”,c);add(int ,int )*函數(shù)add的定義* int ; /* 函數(shù)體 */ z; return(z); 第40頁/共124頁嵌套定義就是在定義一個(gè)函數(shù)時(shí),其函數(shù)體內(nèi)又包含另一個(gè)函數(shù)的完整定義 。語言不能嵌套定義函數(shù),但可以嵌套調(diào)用函數(shù),也就是說,在調(diào)用一個(gè)函數(shù)的過程中,又調(diào)用另一個(gè)函數(shù)。 第41頁/共124頁第42頁/共124頁例 8.8. 用弦截法求方程 f(x)=xf(x)=x3 3-5x-5x2 2+16x-80=0 +16x-80=0 的根 第43頁/共124頁(1) 取兩個(gè)不同點(diǎn)x1,x2,如果f(x1)和f(x

24、2)符號(hào)相反,則(x1,x2)區(qū)間內(nèi)必有一個(gè)根。如果f(x1)與f(x2)同符號(hào),則應(yīng)改變x1,x2,直到f(x1)、f(x2)異號(hào)為止。注意x1、x2的值不應(yīng)差太大,以保證(x1,x2)區(qū)間內(nèi)只有一個(gè)根。 (2) 連接(x1,f(x1)和(x2,f(x2)兩點(diǎn),此線(即弦)交x軸于x。方法:第44頁/共124頁(3)(3) 若f(x)與f(x1)同符號(hào),則根必在(x,x2)區(qū)間內(nèi),此時(shí)將x作為新的x1。如果f(x)與f(x2)同符號(hào),則表示根在(x1,x)區(qū)間內(nèi),將x作為新的x2。(4)(4) 重復(fù)步驟 (2) 和 (3) , 直到 f(x) 為止, 為一個(gè)很小的數(shù), 例如 1e-6 此時(shí)認(rèn)

25、為 f(x)0 第45頁/共124頁N-S流程圖 第46頁/共124頁分別用幾個(gè)函數(shù)來實(shí)現(xiàn)各部分功能:(1) 用函數(shù)f(x)代表x的函數(shù):x3-5x2+16x-80.(2) 用函數(shù)xpoint (x1,x2)來求(x1,f(x1)和 (x2,f(x2)的連線與x軸的交點(diǎn)x的坐標(biāo)。(3) 用函數(shù)root (x1,x2)來求(x1,x2)區(qū)間的 那個(gè)實(shí)根。顯然,執(zhí)行root函數(shù)過程中要用 到函數(shù)xpoint,而執(zhí)行xpoint函數(shù)過程中要用 到f函數(shù)。第47頁/共124頁 float f(float x) * 定義函數(shù),以實(shí) 現(xiàn)f(x) x3-5x2+16x-80 *float ; =(-5.0)

26、*+16.0)*-80.0; return(y); 第48頁/共124頁float xpoint(float x1,float x2) *定義xpoint函數(shù),求出弦與x軸交點(diǎn) */float ; =(x1*f(x2)-x2*f(x1)/f(x2)-f(x1); return(); 第49頁/共124頁float root(float x1,float x2) /* 定義root函數(shù),求近似根 */float x,y1; y1(); do (,); (); if(*) /*()與()同符號(hào) */ ; ; else 2; while(fabs()1e-6); return(); 第50頁/共12

27、4頁 void main() 主函數(shù)float ,; do printf( ,:); scanf(,); (); (); while(*); (,); printf( root of equation is .n,); 運(yùn)行情況如下:運(yùn)行情況如下: ,:, root of equation is 第51頁/共124頁作業(yè): 8.1 8.2 8.3 7.6 7.7 7.9 7.14第52頁/共124頁 在調(diào)用一個(gè)函數(shù)的過程中又出現(xiàn)直接或間接地在調(diào)用一個(gè)函數(shù)的過程中又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸調(diào)用。語調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸調(diào)用。語言的特點(diǎn)之一就在于允許函數(shù)的遞歸調(diào)用。例

28、言的特點(diǎn)之一就在于允許函數(shù)的遞歸調(diào)用。例如:如: (int ) ,; (); return(*); 第53頁/共124頁例 8 有個(gè)人坐在一起,問第個(gè)人多少歲?他說比第個(gè)人大歲。問第個(gè)人歲數(shù),他說比第個(gè)人大歲。問第個(gè)人,又說比第個(gè)人大歲。問第個(gè)人,說比第個(gè)人大歲。最后問第個(gè)人,他說是歲。請(qǐng)問第個(gè)人多大。 ()()()()()()()()()可以用數(shù)學(xué)公式表述如下:() ()() ()第54頁/共124頁可以用一個(gè)函數(shù)來描述上述遞歸過程:int age(int ) *求年齡的遞歸函數(shù)* int ; * 用作存放函數(shù)的返回值的變量 * if() ; else (); return();用一個(gè)主函數(shù)

29、調(diào)用age函數(shù),求得第5人的年齡。#include void main() (,(); 運(yùn)行結(jié)果如下: 第55頁/共124頁例8.8.用遞歸方法求! 求!也可以用遞歸方法,即!等于!,而!??捎孟旅娴倪f歸公式表示: ! (,) ()! ()第56頁/共124頁遞歸調(diào)用 以下程序輸出結(jié)果是_.main()printf(%d”,fun(5); fun(int n)if(n= =1) return 1; return n-fun(n-1);第57頁/共124頁遞歸調(diào)用#include void fun2(int n)printf(“%dn”,n); if(n70) fun2(n+25);main()

30、 fun2(25);程序輸出的第一行是_,第二行是_.第58頁/共124頁void f(int a)if(a0) printf(“-”); a=-a; printf(“%c”,a%10+0); if(a=a/10)!=0)f(a); main()int a=-3567; f (a); printf(“n”); a=3456; f(a); printf(“n”); 執(zhí)行以上程序后,輸出的第一行是_.第二行是_.第59頁/共124頁例 8.8. (漢諾)塔問題。這是一個(gè)古典的數(shù)學(xué)問題,是一個(gè)用遞歸方法解題的典型例子。問題是這樣的:古代有一個(gè)梵塔,塔內(nèi)有3 3個(gè)座A A、B B、C C,開始時(shí)座上有

31、個(gè)盤子,盤子大小不等,大的在下,小的在上(見圖8 8)。有一個(gè)老和尚想把這個(gè)盤子從座移到座,但每次只允許移動(dòng)一個(gè)盤,且在移動(dòng)過程中在3 3個(gè)座上都始終保持大盤在下,小盤在上。在移動(dòng)過程中可以利用座,要求編程序打印出移動(dòng)的步驟。 第60頁/共124頁第61頁/共124頁為便于理解,我們先分析將座上個(gè)盤子移到座上的過程:(1) 將座上個(gè)盤子移到座上(借助);(2) 將座上個(gè)盤子移到座上;(3) 將座上個(gè)盤子移到座上(借助)。其中第()步可以直接實(shí)現(xiàn)。第步又可用遞歸方法分解為: 將上個(gè)盤子從移到; 將上個(gè)盤子從移到; 將上個(gè)盤子從移到。第()步可以分解為: 將上個(gè)盤子從移到上; 將上個(gè)盤子從移到上;

32、 將上個(gè)盤子從移到上。將以上綜合起來,可得到移動(dòng)3個(gè)盤子的步驟為,。第62頁/共124頁由上面的分析可知:將個(gè)盤子從座移到座可以分解為以下3個(gè)步驟:(1) 將上個(gè)盤借助座先移到座上。(2) 把座上剩下的一個(gè)盤移到座上。(3) 將個(gè)盤從座借助于座移到座上。第63頁/共124頁程序如下:#include void main()void hanoi(int n,char one,char two,char three); /* 對(duì)hanoi函數(shù)的聲明 */ int m; printf(input the number of diskes:); scanf(“%d”,&m); printf(T

33、he step to moveing %d diskes:n,m); hanoi(m,A,B,C); 第64頁/共124頁void hanoi(int n,char one,char two,char three) /* 定義hanoi函數(shù),將個(gè)盤從one座借助two座,移到three座 */ void move(char x,char y); /* 對(duì)move函數(shù)的聲明 */ if(n=1) move(one,three); else hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three); void move(

34、char x,char y) /* 定義move函數(shù) */ printf(“%c-%cn,x,y); 第65頁/共124頁運(yùn)行情況如下:input the number of diskes:3 The steps to noving 3 diskes: 第66頁/共124頁8.數(shù)組作為函數(shù)參數(shù)在C語言中,主調(diào)函數(shù)與被調(diào)函數(shù)之間的信息傳遞方式有兩種:傳值和傳地址1.傳值的調(diào)用過程:(1)形參與實(shí)參各占一個(gè)獨(dú)立的存儲(chǔ)空間;(2)形參的存儲(chǔ)空間是函數(shù)被調(diào)用時(shí)才分配的.調(diào)用開始,系統(tǒng)為形參開辟一個(gè)臨時(shí)存儲(chǔ)區(qū),然后將各實(shí)參值傳遞給形參.(3)函數(shù)返回時(shí),臨時(shí)存儲(chǔ)區(qū)也被撤消.傳值調(diào)用的特點(diǎn):函數(shù)中對(duì)形參變

35、量的操作不會(huì)影響到主調(diào)函數(shù)中的實(shí)參變量.第67頁/共124頁由于實(shí)參可以是表達(dá)式,而數(shù)組元素可以是表達(dá)式的組成部分,因此數(shù)組元素當(dāng)然可以作為函數(shù)的實(shí)參,與用變量作實(shí)參一樣,是單向傳遞,即“值傳送”方式。 例8. 有兩個(gè)數(shù)組和,各有個(gè)元素,將它們對(duì)應(yīng)地逐個(gè)相比(即與比,與比)。如果數(shù)組中的元素大于數(shù)組中的相應(yīng)元素的數(shù)目多于b數(shù)組中元素大于a數(shù)組中相應(yīng)元素的數(shù)目(例如,aibi6次,biai3次,其中i每次為不同的值),則認(rèn)為a數(shù)組大于b數(shù)組,并分別統(tǒng)計(jì)出兩個(gè)數(shù)組相應(yīng)元素大于、等于、小于的次數(shù)。 第68頁/共124頁#include void main() int large(int x,int

36、y); /* 函數(shù)聲明 */ int 10,10,,; printf(enter array a ); for(;) scanf(,); printf(); printf( enter array ); for(;) scanf (,); printf(); for(;) if(large (i,i )= ) ; else if( large (i,i )=) =+; else ;第69頁/共124頁printf(aibi %d timesn ai=bi %d timesn aik) printf(array a is larger than array bn);else if (nk) pr

37、intf(array a is smaller than array bn); else printf(array is equal to array bn);large(int ,int ) int ; if(); else if()flag; else flag; return(flag);第70頁/共124頁運(yùn)行情況如下: enter array a: 5 3 8 9 1 3 5 6 0 4 array a is smaller thann array b第71頁/共124頁 (傳地址調(diào)用)可以用數(shù)組名作函數(shù)參數(shù),此時(shí)形參應(yīng)當(dāng)用數(shù)組名或用指針變量 。例8.11 有一個(gè)一維數(shù)組,內(nèi)放個(gè)學(xué)生

38、成績,求平均成績。特點(diǎn):在形參和實(shí)參結(jié)合的過程中,是實(shí)參地址傳遞給形參,使形參與實(shí)參共同占用一段存儲(chǔ)單元,從而當(dāng)在被調(diào)函數(shù)中形參的值改變了,也就意味著實(shí)參元素的值發(fā)生了變化.第72頁/共124頁#include void main() float average(float array10); /* 函數(shù)聲明 */ float score10 , aver; int ; printf(input scores:); for(;) scanf(,score); printf(); averaverage( score ); printf ( average score is .n, aver);

39、第73頁/共124頁float average (float array10) int ; float aver,sum; for (;) ;return(aver);運(yùn)行情況如下:input scores: 100 56 78 98.5 76 86 99 67.5 75 average score is 83.40 第74頁/共124頁例 8.形參數(shù)組不定義長度#include void main() float average(float ,int ); float score_15 , .,; float score_210= 67.5,89.5,99,6.5, 77,89.5,76.5

40、,54,60,99.5; printf(“the average of class A is %6.2fn”, average(score_1,5); printf(“the average of class B is %6.2fn”, average(score_2,10); 第75頁/共124頁float average(float ,int ) int ; float aver,; for(;) sumsumarray; aversum; return(); 運(yùn)行結(jié)果如下:the average of class A is 80.40The average of class is 78.

41、20第76頁/共124頁例 8.13 用選擇法對(duì)數(shù)組中10個(gè)整數(shù)按由小到大排序。所謂選擇法就是先將10個(gè)數(shù)中最小的數(shù)與a0對(duì)換;再將a1到a9中最小的數(shù)與a1對(duì)換每比較一輪,找出一個(gè)未經(jīng)排序的數(shù)中最小的一個(gè)。共比較9輪。第77頁/共124頁a0 a1 a2 a3 a4 3 6 1 9 4 未排序時(shí)的情況未排序時(shí)的情況 1 6 3 9 4 將將5個(gè)數(shù)中最小的數(shù)個(gè)數(shù)中最小的數(shù)1與與a0對(duì)換對(duì)換 1 3 6 9 4 將余下的將余下的4個(gè)數(shù)中最小的數(shù)個(gè)數(shù)中最小的數(shù)3與與a1對(duì)換對(duì)換 1 3 4 9 6 將余下的將余下的3個(gè)數(shù)中最小的數(shù)個(gè)數(shù)中最小的數(shù)4與與a2對(duì)換對(duì)換 1 3 4 6 9 將余下的將余下

42、的2個(gè)數(shù)中最小的數(shù)個(gè)數(shù)中最小的數(shù)6與與a3對(duì)對(duì) 換,至此完成排序換,至此完成排序 第78頁/共124頁程序?qū)嵗?include void main() void sort(int ,int ); int ,; printf(enter the array); for(;) scanf(,); sort(,); printf(the sorted array ); for(; printf(,); printf(); 第79頁/共124頁void sort(int ,int ) int ,; for(;) ; for(;) if(array array)=; =arrayk; arrayk=ar

43、rayi; arrayi=t; 第80頁/共124頁程序如下:#include void main() int max_value ( int 4); int a34=1,3,5,7,2,4,6,8,15,17,34,12; printf(max value is , max_value(a) ); 第81頁/共124頁max_value ( int array 4) int ,; =; (=;) (;(array) = array ; return(); 運(yùn)行結(jié)果如下:Max value is 34第82頁/共124頁作業(yè)8.13 8.17 8.4 8.5 8.7 8.88.11 8.14

44、第83頁/共124頁在一個(gè)函數(shù)內(nèi)部定義的變量是局部變量,它只在本函數(shù)范圍內(nèi)有效,也就是說只有在本函數(shù)內(nèi)才能使用它們,在此函數(shù)以外是不能使用這些變量的。這稱為“局部變量”。 第84頁/共124頁float f1( int a) /*函數(shù)f1 */int b,c; a、b、c有效 char f2(int x,int y) /*函數(shù)f2 */int i,j; x、y、i、j有效 void main( ) /*主函數(shù)*/int m,n; m、n有效 第85頁/共124頁(1) 主函數(shù)中定義的變量(m,n)也只在主函數(shù)中有效,而不因?yàn)樵谥骱瘮?shù)中定義而在整個(gè)文件或程序中有效。主函數(shù)也不能使用其他函數(shù)中定義

45、的變量。(2) 不同函數(shù)中可以使用相同名字的變量,它們代表不同的對(duì)象,互不干擾。例如, 上面在f1函數(shù)中定義了變量b和c,倘若在f2函數(shù)中也定義變量b和c,它們?cè)趦?nèi)存中占不同的單元,互不混淆。(3) 形式參數(shù)也是局部變量。例如上面f1函數(shù)中的形參a,也只在f1函數(shù)中有效。其他函數(shù)可以調(diào)用f1函數(shù),但不能引用f1函數(shù)的形參a。(4) 在一個(gè)函數(shù)內(nèi)部,可以在復(fù)合語句中定義變量,這些變量只在本復(fù)合語句中有效,這種復(fù)合語句也稱為“分程序”或“程序塊”。說明第86頁/共124頁void main ( )int a,b; int c; c=a+b; c在此范圍內(nèi)有效 a,b在此范圍內(nèi)有效 第87頁/共12

46、4頁在函數(shù)內(nèi)定義的變量是局部變量,而在函數(shù)之外定義的變量稱為外部變量,外部變量是全局變量(也稱全程變量)。全局變量可以為本文件中其他函數(shù)所共用。它的有效范圍為從定義變量的位置開始到本源文件結(jié)束。 第88頁/共124頁int p=1,q=5; /* 外部變量 */float f1(int a) /* 定義函數(shù)f1 */int b,c;char c1,c2; /* 外部變量*/char f2 (int x, int y) /* 定義函數(shù)f2 */int i,j; 全局變量p,q的作用范圍 全局變量c1,c2的作用范圍void main ( ) /*主函數(shù)*/int m,n; 第89頁/共124頁例

47、 8.15 有一個(gè)一維數(shù)組,內(nèi)放個(gè)學(xué)生成績,寫一個(gè)函數(shù),求出平均分、最高分和最低分。 #include float Max,Min; *全局變量*void main() float average(float array ,int n); float ave,score10; int ; for(;) scanf(,); ave= average(,); printf(“max=%6.2fnmin=%6.2fn average=%6.2fn“,Max,Min,ave); 第90頁/共124頁float average(float array ,int n) * 定義函數(shù),形參為數(shù)組 */ in

48、t ; float aver,sum=array; Max=Min=array; for(=;) if(arrayMax)Maxarray; else if(arrayMin)Min array; sum=sum+array; aver; return(); 運(yùn)行情況如下:99 45 78 97 100 67.5 89 92 66 43 第91頁/共124頁第92頁/共124頁建議不必要時(shí)不要使用全局變量,原因如下: 全局變量在程序的全部執(zhí)行過程中都占用存儲(chǔ)單元,而不是僅在需要時(shí)才開辟單元。 使用全局變量過多,會(huì)降低程序的清晰性,人們往往難以清楚地判斷出每個(gè)瞬時(shí)各個(gè)外部變量的值。在各個(gè)函數(shù)執(zhí)行

49、時(shí)都可能改變外部變量的值,程序容易出錯(cuò)。因此,要限制使用全局變量。第93頁/共124頁它使函數(shù)的通用性降低了,因?yàn)楹瘮?shù)在執(zhí)行時(shí)要依賴于其所在的外部變量。如果將一個(gè)函數(shù)移到另一個(gè)文件中,還要將有關(guān)的外部變量及其值一起移過去。但若該外部變量與其他文件的變量同名時(shí),就會(huì)出現(xiàn)問題,降低了程序的可靠性和通用性。一般要求把程序中的函數(shù)做成一個(gè)封閉體,除了可以通過“實(shí)參形參”的渠道與外界發(fā)生聯(lián)系外,沒有其他渠道。第94頁/共124頁例例 8.8.6 6 外部變量與局部變量同名外部變量與局部變量同名#include int a=3,b=5; /* a,b為外部變量*/ a,b作用范圍void main ( )

50、 int a=8; /*a為局部變量 */ 局部變量a作用范圍 printf (%d, max (a,b); max (int a, int b) /*a,b為局部變量 */ int c; c=ab?a b; 形參a、b作用范圍 return (c); 運(yùn)行結(jié)果為8 第95頁/共124頁 前面已介紹了從變量的作用域(即從空間)角度來分,可以分為全局變量和局部變量。那么從變量值存在的時(shí)間(即生存期)角度來分,又可以分為靜態(tài)存儲(chǔ)方式和動(dòng)態(tài)存儲(chǔ)方式。 所謂靜態(tài)存儲(chǔ)方式是指在程序運(yùn)行期間由系統(tǒng)分配固定的存儲(chǔ)空間的方式。而動(dòng)態(tài)存儲(chǔ)方式則是在程序運(yùn)行期間根據(jù)需要進(jìn)行動(dòng)態(tài)的分配存儲(chǔ)空間的方式。 存儲(chǔ)空間可以

51、分為三部分: 程序區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)第96頁/共124頁在語言中每一個(gè)變量和函數(shù)有兩個(gè)屬性:數(shù)據(jù)類型和數(shù)據(jù)的存儲(chǔ)類別。對(duì)數(shù)據(jù)類型,讀者已熟悉(如整型、字符型等)。存儲(chǔ)類別指的是數(shù)據(jù)在內(nèi)存中存儲(chǔ)的方式。存儲(chǔ)方式分為兩大類:靜態(tài)存儲(chǔ)類和動(dòng)態(tài)存儲(chǔ)類。具體包含四種:自動(dòng)的(),靜態(tài)的(),寄存器的(),外部的()。根據(jù)變量的存儲(chǔ)類別,可以知道變量生存期。 第97頁/共124頁函數(shù)中的局部變量,如不專門聲明為static存儲(chǔ)類別,都是動(dòng)態(tài)地分配存儲(chǔ)空間的,數(shù)據(jù)存儲(chǔ)在動(dòng)態(tài)存儲(chǔ)區(qū)中。函數(shù)中的形參和在函數(shù)中定義的變量(包括在復(fù)合語句中定義的變量),都屬此類,在調(diào)用該函數(shù)時(shí)系統(tǒng)會(huì)給它們分配存儲(chǔ)空間,在函數(shù)調(diào)

52、用結(jié)束時(shí)就自動(dòng)釋放這些存儲(chǔ)空間。因此這類局部變量稱為自動(dòng)變量。自動(dòng)變量用關(guān)鍵字作存儲(chǔ)類別的聲明。例如:int (int ) *定義f函數(shù),為形參 *auto int ,; *定義、為自動(dòng)變量 * 第98頁/共124頁 有時(shí)希望函數(shù)中的局部變量的值在函數(shù)調(diào)用結(jié)束后不消失而保留原值,即其占用的存儲(chǔ)單元不釋放,在下一次該函數(shù)調(diào)用時(shí),該變量已有值,就是上一次函數(shù)調(diào)用結(jié)束時(shí)的值。這時(shí)就應(yīng)該指定該局部變量為“靜態(tài)局部變量”,用關(guān)鍵字進(jìn)行聲明。通過下面簡單的例子可以了解它的特點(diǎn)。第99頁/共124頁例87 考察靜態(tài)局部變量的值。#include void main()int (int); int ,; fo

53、r(;) printf( ,(); int (int )auto int ; static int ; ; return(); 第100頁/共124頁對(duì)靜態(tài)局部變量的說明:(1) 靜態(tài)局部變量屬于靜態(tài)存儲(chǔ)類別,在靜態(tài)存儲(chǔ)區(qū)內(nèi)分配存儲(chǔ)單元。在程序整個(gè)運(yùn)行期間都不釋放。而自動(dòng)變量(即動(dòng)態(tài)局部變量)屬于動(dòng)態(tài)存儲(chǔ)類別,占動(dòng)態(tài)存儲(chǔ)區(qū)空間而不占靜態(tài)存儲(chǔ)區(qū)空間,函數(shù)調(diào)用結(jié)束后即釋放。(2) 對(duì)靜態(tài)局部變量是在編譯時(shí)賦初值的,即只賦初值一次,在程序運(yùn)行時(shí)它已有初值。以后每次調(diào)用函數(shù)時(shí)不再重新賦初值而只是保留上次函數(shù)調(diào)用結(jié)束時(shí)的值。而對(duì)自動(dòng)變量賦初值,不是在編譯時(shí)進(jìn)行的,而是在函數(shù)調(diào)用時(shí)進(jìn)行,每調(diào)用一次函數(shù)重新

54、給一次初值,相當(dāng)于執(zhí)行一次賦值語句。第101頁/共124頁(3)如在定義局部變量時(shí)不賦初值的話,則對(duì)靜態(tài)局部變量來說,編譯時(shí)自動(dòng)賦初值(對(duì)數(shù)值型變量)或空字符(對(duì)字符變量)。而對(duì)自動(dòng)變量來說,如果不賦初值則它的值是一個(gè)不確定的值。這是由于每次函數(shù)調(diào)用結(jié)束后存儲(chǔ)單元已釋放,下次調(diào)用時(shí)又重新另分配存儲(chǔ)單元,而所分配的單元中的值是不確定的。(4) 雖然靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后仍然存在,但其他函數(shù)是不能引用它的。第102頁/共124頁例88 輸出到的階乘值。#include void main()int fac(int ); int ; for(;) printf(%!=,fac();Int fa

55、c(int )static int ; *; return(); 第103頁/共124頁8.9.4 register變量 一般情況下,變量(包括靜態(tài)存儲(chǔ)方式和動(dòng)態(tài)存儲(chǔ)方式)的值是存放在內(nèi)存中的。當(dāng)程序中用到哪一個(gè)變量的值時(shí),由控制器發(fā)出指令將內(nèi)存中該變量的值送到運(yùn)算器中。 經(jīng)過運(yùn)算器進(jìn)行運(yùn)算,如果需要存數(shù),再從運(yùn)算器將數(shù)據(jù)送到內(nèi)存存放。 第104頁/共124頁如果有一些變量使用頻繁(例如在一個(gè)函數(shù)中執(zhí)行次循環(huán),每次循環(huán)中都要引用某局部變量),則為存取變量的值要花費(fèi)不少時(shí)間。為提高執(zhí)行效率,語言允許將局部變量的值放在CPU中的寄存器中,需要用時(shí)直接從寄存器取出參加運(yùn)算,不必再到內(nèi)存中去存取。由于

56、對(duì)寄存器的存取速度遠(yuǎn)高于對(duì)內(nèi)存的存取速度,因此這樣做可以提高執(zhí)行效率。這種變量叫做寄存器變量,用關(guān)鍵字register作聲明。例如,例819中的程序是輸出到n的階乘的值。第105頁/共124頁例819使用寄存器變量#include void main ( )long fac(long); long i,n; scanf(%ld,&n); for(i=1;i=n;i+) printf(%ld!=%ldn,i,fac(i);long fac(long n)register long i,f=1; /*定義寄存器變量*/ for (i=1;i=n;i+) f=f*i; return (f);

57、第106頁/共124頁8.5用extern聲明外部變量外部變量是在函數(shù)的外部定義的全局變量,它的作用域是從變量的定義處開始,到本程序文件的末尾。在此作用域內(nèi),全局變量可以為程序中各個(gè)函數(shù)所引用。編譯時(shí)將外部變量分配在靜態(tài)存儲(chǔ)區(qū)。有時(shí)需要用extern來聲明外部變量,以擴(kuò)展外部變量的作用城。第107頁/共124頁1. 在一個(gè)文件內(nèi)聲明外部變量例820 用extern聲明外部變量,擴(kuò)展它在程序文件中的作用域。#include void main() int max(int,int); *外部變量聲明* extern A,B; printf(%dn,max(A,B); int A=13,B=-8;

58、*定義外部變量* int max(int x,int y) *定義函數(shù) * int z; z=xy?x:y; return(z); 第108頁/共124頁2. 在多文件的程序中聲明外部變量例8 用extern將外部變量的作用域擴(kuò)展到其他文件。 本程序的作用是給定的值,輸入A和,求 A和Am的值。文件file中的內(nèi)容為:#include int A; /*定義外部變量*/void main() int (int); /*函數(shù)聲明*/ int ,; printf(enter the number A and its power m:n); scanf(,A,); A*; printf(*,A,);

59、 (); printf(*n,A,); 第109頁/共124頁文件file中的內(nèi)容為:extern A; /*聲明A為一個(gè)已定義的外部變量*/ int (int );int ,; for(;) *A; return(); 第110頁/共124頁8.9.6用static聲明外部變量 有時(shí)在程序設(shè)計(jì)中希望某些外部變量只限于被本文件引用,而不能被其他文件引用。這時(shí)可以在定義外部變量時(shí)加一個(gè)static聲明。例如:file1.c file2.cstatic int A; extern int A;void main ( ) void fun (int n) A=A*n; 第111頁/共124頁8.9.

60、7關(guān)于變量的聲明和定義 對(duì)變量而言,聲明與定義的關(guān)系稍微復(fù)雜一些。在聲明部分出現(xiàn)的變量有兩種情況:一種是需要建立存儲(chǔ)空間的(如:int a; ),另一種是不需要建立存儲(chǔ)空間的(如:extern a;)。前者稱為“定義性聲明”(defining declaration) ,或簡稱定義(definition)。 后者稱為“引用性聲明”(referencing declaration)。廣義地說,聲明包括定義,但并非所有的聲明都是定義。對(duì)“int a;” 而言,它既是聲明,又是定義。而對(duì)“extern a;” 而言,它是聲明而不是定義。第112頁/共124頁一般為了敘述方便,把建立存儲(chǔ)空間的聲明稱定義,而把不需要建立存

溫馨提示

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

評(píng)論

0/150

提交評(píng)論