C語(yǔ)言程序設(shè)計(jì)ppt-第5章_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì)ppt-第5章_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì)ppt-第5章_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì)ppt-第5章_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì)ppt-第5章_第5頁(yè)
已閱讀5頁(yè),還剩68頁(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、6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組1C C語(yǔ)言與程序設(shè)計(jì)語(yǔ)言與程序設(shè)計(jì)The C Programming Language 第第5 5章章 函數(shù)與程序結(jié)構(gòu) 華中科技大學(xué)計(jì)算機(jī)學(xué)院華中科技大學(xué)計(jì)算機(jī)學(xué)院盧萍盧萍6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組2第5章 函數(shù)與程序結(jié)構(gòu) n結(jié)構(gòu)化編程和結(jié)構(gòu)化編程和C程序的一般結(jié)構(gòu)程序的一般結(jié)構(gòu)n函數(shù)的機(jī)制,包括函數(shù)定義、函數(shù)聲明、函函數(shù)的機(jī)制,包括函數(shù)定義、函數(shù)聲明、函數(shù)調(diào)用、變量的存儲(chǔ)類型、參數(shù)數(shù)目可變的數(shù)調(diào)用、變量的存儲(chǔ)類型、參數(shù)數(shù)目可變的函數(shù)等。函數(shù)等。6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組35.1 C5.1

2、 C程序的一般結(jié)構(gòu)程序的一般結(jié)構(gòu)5.1.1 結(jié)構(gòu)化程序設(shè)計(jì)結(jié)構(gòu)化程序設(shè)計(jì) 結(jié)構(gòu)化編程是一種解決問(wèn)題的策略,它包括如下結(jié)構(gòu)化編程是一種解決問(wèn)題的策略,它包括如下2條條編程標(biāo)準(zhǔn):編程標(biāo)準(zhǔn):(1) 程序中的控制流應(yīng)該盡可能簡(jiǎn)單。程序中的控制流應(yīng)該盡可能簡(jiǎn)單。(2) 應(yīng)該自頂向下地設(shè)計(jì)程序結(jié)構(gòu)。應(yīng)該自頂向下地設(shè)計(jì)程序結(jié)構(gòu)。 自頂向下設(shè)計(jì)也稱為逐步細(xì)化,即把一個(gè)問(wèn)題按功能自頂向下設(shè)計(jì)也稱為逐步細(xì)化,即把一個(gè)問(wèn)題按功能分解為若干子問(wèn)題,如果子問(wèn)題還較復(fù)雜,可將其繼分解為若干子問(wèn)題,如果子問(wèn)題還較復(fù)雜,可將其繼續(xù)分解,直到分解成為容易求解的子問(wèn)題為止。分解續(xù)分解,直到分解成為容易求解的子問(wèn)題為止。分解而來(lái)的

3、每個(gè)子問(wèn)題被稱為模塊,而來(lái)的每個(gè)子問(wèn)題被稱為模塊,C中提供的函數(shù)機(jī)制中提供的函數(shù)機(jī)制完成每個(gè)模塊的編程任務(wù),即用函數(shù)編寫由分解而來(lái)完成每個(gè)模塊的編程任務(wù),即用函數(shù)編寫由分解而來(lái)的子問(wèn)題的代碼。的子問(wèn)題的代碼。6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組45.1.2 5.1.2 蒙特卡羅模擬:猜數(shù)游戲蒙特卡羅模擬:猜數(shù)游戲 n模擬算法是最基本的算法,例如,編程實(shí)現(xiàn)拋硬幣、擲骰子和玩牌等現(xiàn)實(shí)模擬算法是最基本的算法,例如,編程實(shí)現(xiàn)拋硬幣、擲骰子和玩牌等現(xiàn)實(shí)世界中的隨機(jī)事件要用模擬算法。在程序設(shè)計(jì)中,可使用隨機(jī)數(shù)函數(shù)來(lái)模世界中的隨機(jī)事件要用模擬算法。在程序設(shè)計(jì)中,可使用隨機(jī)數(shù)函數(shù)來(lái)模擬現(xiàn)實(shí)中不

4、可預(yù)測(cè)情況,這稱為蒙特卡羅模擬。隨機(jī)數(shù)以其不確定性和偶擬現(xiàn)實(shí)中不可預(yù)測(cè)情況,這稱為蒙特卡羅模擬。隨機(jī)數(shù)以其不確定性和偶然性等特點(diǎn)在很多地方都有具體的用處。比如,軟件測(cè)試中,用于產(chǎn)生具然性等特點(diǎn)在很多地方都有具體的用處。比如,軟件測(cè)試中,用于產(chǎn)生具有普遍意義的測(cè)試數(shù)據(jù),在加密系統(tǒng)中產(chǎn)生密鑰,在網(wǎng)絡(luò)中生成驗(yàn)證碼等。有普遍意義的測(cè)試數(shù)據(jù),在加密系統(tǒng)中產(chǎn)生密鑰,在網(wǎng)絡(luò)中生成驗(yàn)證碼等。n在在C語(yǔ)言中,用語(yǔ)言中,用rand函數(shù)生成隨機(jī)數(shù),該函數(shù)稱為隨機(jī)數(shù)發(fā)生器,該發(fā)生函數(shù)生成隨機(jī)數(shù),該函數(shù)稱為隨機(jī)數(shù)發(fā)生器,該發(fā)生器從稱為種子(一個(gè)無(wú)符號(hào)整型數(shù))的初始值開(kāi)始用確定的算法產(chǎn)生隨機(jī)器從稱為種子(一個(gè)無(wú)符號(hào)整型數(shù)

5、)的初始值開(kāi)始用確定的算法產(chǎn)生隨機(jī)數(shù)。顯然,通過(guò)種子產(chǎn)生第一個(gè)隨機(jī)數(shù)后,后續(xù)的隨機(jī)序列也就是確定的數(shù)。顯然,通過(guò)種子產(chǎn)生第一個(gè)隨機(jī)數(shù)后,后續(xù)的隨機(jī)序列也就是確定的了,這種依靠計(jì)算機(jī)內(nèi)部算法產(chǎn)生的了,這種依靠計(jì)算機(jī)內(nèi)部算法產(chǎn)生的“隨機(jī)隨機(jī)”數(shù)稱為偽隨機(jī)數(shù)。由此可見(jiàn),數(shù)稱為偽隨機(jī)數(shù)。由此可見(jiàn),隨機(jī)數(shù)的產(chǎn)生依賴于種子,為了使程序在反復(fù)運(yùn)行時(shí)能產(chǎn)生不同的隨機(jī)數(shù),隨機(jī)數(shù)的產(chǎn)生依賴于種子,為了使程序在反復(fù)運(yùn)行時(shí)能產(chǎn)生不同的隨機(jī)數(shù),必須改變這個(gè)種子的值,這稱為初始化隨機(jī)數(shù)發(fā)生器,由函數(shù)必須改變這個(gè)種子的值,這稱為初始化隨機(jī)數(shù)發(fā)生器,由函數(shù)srand來(lái)實(shí)來(lái)實(shí)現(xiàn)。現(xiàn)。 6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C

6、語(yǔ)言課程組5【例【例5.15.1】 編寫一個(gè)猜數(shù)的游戲程序編寫一個(gè)猜數(shù)的游戲程序 n在這個(gè)游戲中,計(jì)算機(jī)產(chǎn)生一個(gè)在這個(gè)游戲中,計(jì)算機(jī)產(chǎn)生一個(gè)1到到1000之之間的隨機(jī)數(shù),并把該數(shù)作為要猜的數(shù)。玩游戲間的隨機(jī)數(shù),并把該數(shù)作為要猜的數(shù)。玩游戲者輸入所猜的數(shù),如果猜得不正確,繼續(xù)猜直者輸入所猜的數(shù),如果猜得不正確,繼續(xù)猜直到正確為止,同時(shí)計(jì)算游戲者猜數(shù)的次數(shù)。為到正確為止,同時(shí)計(jì)算游戲者猜數(shù)的次數(shù)。為了幫助游戲者一步一步得到正確答案,程序會(huì)了幫助游戲者一步一步得到正確答案,程序會(huì)不斷地發(fā)出信息不斷地發(fā)出信息“Too high”或或“Too low”。最后,程序向游戲者顯示游戲結(jié)果。最后,程序向游戲者

7、顯示游戲結(jié)果。 6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組6自頂向下的分解問(wèn)題:自頂向下的分解問(wèn)題:n既然是一個(gè)游戲程序,就應(yīng)該允許玩家反復(fù)玩既然是一個(gè)游戲程序,就應(yīng)該允許玩家反復(fù)玩多次,直到不想玩為止。同時(shí),將玩一次游戲多次,直到不想玩為止。同時(shí),將玩一次游戲的任務(wù)分解成以下兩個(gè)子任務(wù):的任務(wù)分解成以下兩個(gè)子任務(wù):n(1)計(jì)算機(jī)產(chǎn)生一個(gè))計(jì)算機(jī)產(chǎn)生一個(gè)1到到1000的隨機(jī)數(shù)供游的隨機(jī)數(shù)供游戲者猜測(cè);戲者猜測(cè);n(2)游戲者猜數(shù),直至猜對(duì)。)游戲者猜數(shù),直至猜對(duì)。 6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組7主程序結(jié)構(gòu)主程序結(jié)構(gòu) do 計(jì)算機(jī)產(chǎn)生一個(gè)計(jì)算機(jī)產(chǎn)生一個(gè)1到到10

8、00的隨機(jī)數(shù)的隨機(jī)數(shù) 游戲者猜數(shù),直至猜對(duì)游戲者猜數(shù),直至猜對(duì) 繼續(xù)玩嗎繼續(xù)玩嗎 while (繼續(xù)繼續(xù));6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組8自頂向下的分解子任務(wù)(自頂向下的分解子任務(wù)(1 1) 調(diào)用標(biāo)準(zhǔn)庫(kù)函數(shù)調(diào)用標(biāo)準(zhǔn)庫(kù)函數(shù)rand產(chǎn)生一個(gè)隨機(jī)數(shù);產(chǎn)生一個(gè)隨機(jī)數(shù); 將這個(gè)隨機(jī)數(shù)限制在將這個(gè)隨機(jī)數(shù)限制在11000之間。之間。n利用函數(shù),可以實(shí)現(xiàn)程序的模塊化,把程序中常用利用函數(shù),可以實(shí)現(xiàn)程序的模塊化,把程序中常用的一些算法或操作編成通用的函數(shù),以供隨時(shí)調(diào)用,的一些算法或操作編成通用的函數(shù),以供隨時(shí)調(diào)用,大大簡(jiǎn)化主函數(shù)的流程,使程序設(shè)計(jì)簡(jiǎn)單和直觀,大大簡(jiǎn)化主函數(shù)的流程,使程序設(shè)

9、計(jì)簡(jiǎn)單和直觀,提高程序的易讀性和可維護(hù)性。提高程序的易讀性和可維護(hù)性。 n把任務(wù)把任務(wù)1設(shè)計(jì)成一個(gè)獨(dú)立的函數(shù),用函數(shù)設(shè)計(jì)成一個(gè)獨(dú)立的函數(shù),用函數(shù)GetNum(void) 來(lái)實(shí)現(xiàn)來(lái)實(shí)現(xiàn).6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組9函數(shù)函數(shù) int GetNum(void) int GetNum(void) /* 函數(shù)名稱:函數(shù)名稱:GetNum 函數(shù)功能:產(chǎn)生一個(gè)函數(shù)功能:產(chǎn)生一個(gè)1到到MAX_NUMBER之間的隨機(jī)數(shù),供游戲者猜測(cè)。之間的隨機(jī)數(shù),供游戲者猜測(cè)。 函數(shù)參數(shù):無(wú)函數(shù)參數(shù):無(wú) 函數(shù)返回值:返回產(chǎn)生的隨機(jī)數(shù)函數(shù)返回值:返回產(chǎn)生的隨機(jī)數(shù)*/int GetNum(void) /*

10、 注意:后面無(wú)分號(hào)注意:后面無(wú)分號(hào) */ /* 函數(shù)開(kāi)始的標(biāo)志函數(shù)開(kāi)始的標(biāo)志 */ int x; printf(A magic number between 1 and %d has been chosen.n, MAX_NUMBER); x=rand(); /* 調(diào)用標(biāo)準(zhǔn)庫(kù)函數(shù)調(diào)用標(biāo)準(zhǔn)庫(kù)函數(shù)rand產(chǎn)生一個(gè)隨機(jī)數(shù)產(chǎn)生一個(gè)隨機(jī)數(shù) */ x= x % MAX_NUMBER + 1;/* 將這個(gè)隨機(jī)數(shù)限制在將這個(gè)隨機(jī)數(shù)限制在1MAX_NUMBER之間之間 */ return(x); /* 返回這個(gè)隨機(jī)數(shù)給調(diào)用者,返回這個(gè)隨機(jī)數(shù)給調(diào)用者,*/ /* 函數(shù)結(jié)束的標(biāo)志函數(shù)結(jié)束的標(biāo)志 */ 6/15/20

11、21華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組10n在函數(shù)的頂端用在函數(shù)的頂端用“/*/”格式包含的部分是函數(shù)格式包含的部分是函數(shù)頭部注釋,包括函數(shù)名稱、函數(shù)功能、函數(shù)參數(shù)、頭部注釋,包括函數(shù)名稱、函數(shù)功能、函數(shù)參數(shù)、函數(shù)返回值等內(nèi)容,如有必要還可增加作者、創(chuàng)建函數(shù)返回值等內(nèi)容,如有必要還可增加作者、創(chuàng)建日期、修改記錄(備注)等相關(guān)項(xiàng)目。雖然函數(shù)頭日期、修改記錄(備注)等相關(guān)項(xiàng)目。雖然函數(shù)頭部注釋在語(yǔ)法上不是必需的,但可以提高程序的質(zhì)部注釋在語(yǔ)法上不是必需的,但可以提高程序的質(zhì)量和可維護(hù)性,在程序設(shè)計(jì)時(shí)要遵從這一編程規(guī)范。量和可維護(hù)性,在程序設(shè)計(jì)時(shí)要遵從這一編程規(guī)范。nGetNum是函數(shù)名,其后的是函

12、數(shù)名,其后的void說(shuō)明函數(shù)調(diào)用時(shí)不說(shuō)明函數(shù)調(diào)用時(shí)不接收任何參數(shù),即沒(méi)有入口參數(shù),函數(shù)執(zhí)行完應(yīng)該接收任何參數(shù),即沒(méi)有入口參數(shù),函數(shù)執(zhí)行完應(yīng)該返回所產(chǎn)生的隨機(jī)數(shù),即該隨機(jī)數(shù)是函數(shù)的出口參返回所產(chǎn)生的隨機(jī)數(shù),即該隨機(jī)數(shù)是函數(shù)的出口參數(shù),函數(shù)名前的數(shù),函數(shù)名前的int說(shuō)明出口參數(shù)的類型為整型。說(shuō)明出口參數(shù)的類型為整型。n函數(shù)體內(nèi)的函數(shù)體內(nèi)的rand是接口是接口stdlib.h中的一個(gè)函數(shù),它中的一個(gè)函數(shù),它返回一個(gè)非負(fù)并且不大于常量返回一個(gè)非負(fù)并且不大于常量RAND_MAX的隨機(jī)整的隨機(jī)整數(shù),數(shù),RAND_MAX的值取決于計(jì)算機(jī)系統(tǒng)。的值取決于計(jì)算機(jī)系統(tǒng)。MAX_NUMBER是用是用#define定

13、義的符號(hào)常量,其定義的符號(hào)常量,其值為值為1000。當(dāng)執(zhí)行。當(dāng)執(zhí)行return語(yǔ)句時(shí),其后表達(dá)式的值語(yǔ)句時(shí),其后表達(dá)式的值被帶回到調(diào)用函數(shù)中。被帶回到調(diào)用函數(shù)中。 6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組11自頂向下的分解子任務(wù)(自頂向下的分解子任務(wù)(2 2)/* 子任務(wù)子任務(wù)2的程序段的程序段 */for(;) 輸入猜測(cè)的數(shù)輸入猜測(cè)的數(shù) if(猜對(duì)了)(猜對(duì)了) 結(jié)束結(jié)束 else if(小了)(小了) 輸出太小的提示輸出太小的提示 else 輸出太大的提示輸出太大的提示 n將任務(wù)(將任務(wù)(2)也設(shè)計(jì)成一個(gè)獨(dú)立的函數(shù))也設(shè)計(jì)成一個(gè)獨(dú)立的函數(shù)GuessNum 6/15/2021華中

14、科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組12函數(shù)函數(shù) void GuessNum(int x) void GuessNum(int x) n源程序源程序ex5_GuessNum是函數(shù)名,括號(hào)里的是函數(shù)名,括號(hào)里的“int x”說(shuō)說(shuō)明該函數(shù)有一個(gè)入口參數(shù)明該函數(shù)有一個(gè)入口參數(shù)x,其類型為整型,其類型為整型,表示被猜測(cè)的神秘?cái)?shù),游戲者如果猜對(duì)就直接表示被猜測(cè)的神秘?cái)?shù),游戲者如果猜對(duì)就直接屏幕輸出猜的次數(shù),無(wú)具體值返回,即函數(shù)無(wú)屏幕輸出猜的次數(shù),無(wú)具體值返回,即函數(shù)無(wú)出口參數(shù),所以將函數(shù)值的類型說(shuō)明為出口參數(shù),所以將函數(shù)值的類型說(shuō)明為void。n函數(shù)體內(nèi)有函數(shù)體內(nèi)有1條條for(;)循環(huán)語(yǔ)句,一直循環(huán)到循環(huán)語(yǔ)

15、句,一直循環(huán)到執(zhí)行執(zhí)行return語(yǔ)句時(shí)結(jié)束。語(yǔ)句時(shí)結(jié)束。 6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組13主函數(shù)主函數(shù)main main n源程序源程序ex5_用蒙特卡羅法模擬該猜數(shù)游戲,在開(kāi)始玩游戲前,用蒙特卡羅法模擬該猜數(shù)游戲,在開(kāi)始玩游戲前,需要調(diào)用函數(shù)需要調(diào)用函數(shù)srand初始化隨機(jī)數(shù)種子,可以采用系初始化隨機(jī)數(shù)種子,可以采用系統(tǒng)時(shí)間(由統(tǒng)時(shí)間(由time函數(shù)得到)作為種子函數(shù)得到)作為種子 .n函數(shù)函數(shù)time返回自返回自1970年年1月月1日以來(lái)經(jīng)歷的秒數(shù),日以來(lái)經(jīng)歷的秒數(shù),將該秒數(shù)賦值給種子變量,隨機(jī)數(shù)種子會(huì)隨著運(yùn)行將該秒數(shù)賦值給種子變量,隨機(jī)數(shù)種子會(huì)隨著運(yùn)行程序的時(shí)間

16、而改變,因而產(chǎn)生的隨機(jī)數(shù)是不可預(yù)見(jiàn)程序的時(shí)間而改變,因而產(chǎn)生的隨機(jī)數(shù)是不可預(yù)見(jiàn)的的 .n函數(shù)函數(shù)srand和和rand的原型在的原型在stdlib.h中,函數(shù)中,函數(shù)time的原型在的原型在time.h中,需要在源程序的頭部包含這兩中,需要在源程序的頭部包含這兩個(gè)頭文件個(gè)頭文件 .6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組14結(jié)構(gòu)化程序設(shè)計(jì)的益處結(jié)構(gòu)化程序設(shè)計(jì)的益處n使程序編制方便,易于管理、修改和調(diào)試。使程序編制方便,易于管理、修改和調(diào)試。n增強(qiáng)了程序的可讀性、可維護(hù)性和可擴(kuò)充性,增強(qiáng)了程序的可讀性、可維護(hù)性和可擴(kuò)充性,方便于多人分工合作完成程序的編制。方便于多人分工合作完成程序的

17、編制。n函數(shù)可以公用,避免在程序中使用重復(fù)的代碼。函數(shù)可以公用,避免在程序中使用重復(fù)的代碼。n提高軟件的可重用性,軟件的可重用性是轉(zhuǎn)向提高軟件的可重用性,軟件的可重用性是轉(zhuǎn)向面向?qū)ο蟪绦蛟O(shè)計(jì)的重要因素。面向?qū)ο蟪绦蛟O(shè)計(jì)的重要因素。6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組155.1.3 C5.1.3 C程序的結(jié)構(gòu)程序的結(jié)構(gòu) nC程序由一個(gè)或多個(gè)函數(shù)組成,其中有且只有一個(gè)程序由一個(gè)或多個(gè)函數(shù)組成,其中有且只有一個(gè)main函數(shù),程序的執(zhí)行總是從函數(shù),程序的執(zhí)行總是從main開(kāi)始。開(kāi)始。 n除除main以外的其它函數(shù)分兩類,一類是由系統(tǒng)提供以外的其它函數(shù)分兩類,一類是由系統(tǒng)提供的標(biāo)準(zhǔn)函數(shù)。

18、另一類是需要由程序員自己編寫的函的標(biāo)準(zhǔn)函數(shù)。另一類是需要由程序員自己編寫的函數(shù)(數(shù)(“自定義函數(shù)自定義函數(shù)”)。)。n組成一個(gè)組成一個(gè)C程序的各個(gè)函數(shù)可以編輯成多個(gè)程序的各個(gè)函數(shù)可以編輯成多個(gè)C源文件,源文件,每一個(gè)每一個(gè)C源文件含有一個(gè)或多個(gè)函數(shù)定義。各源文件含有一個(gè)或多個(gè)函數(shù)定義。各C源文源文件中要用到的一些外部變量說(shuō)明、枚舉類型聲明、件中要用到的一些外部變量說(shuō)明、枚舉類型聲明、結(jié)構(gòu)類型聲明、函數(shù)原型和編譯預(yù)處理指令等可編結(jié)構(gòu)類型聲明、函數(shù)原型和編譯預(yù)處理指令等可編輯成一個(gè)輯成一個(gè).h頭文件,然后在每個(gè)頭文件,然后在每個(gè)C文件中包含該頭文文件中包含該頭文件件 .6/15/2021華中科技大

19、學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組16n每個(gè)源文件可單獨(dú)編譯生成目標(biāo)文件,組成一每個(gè)源文件可單獨(dú)編譯生成目標(biāo)文件,組成一個(gè)個(gè)C程序的所有源文件都被編譯之后,由連接程序的所有源文件都被編譯之后,由連接程序?qū)⒏髂繕?biāo)文件中的目標(biāo)函數(shù)和系統(tǒng)標(biāo)準(zhǔn)函程序?qū)⒏髂繕?biāo)文件中的目標(biāo)函數(shù)和系統(tǒng)標(biāo)準(zhǔn)函數(shù)庫(kù)的函數(shù)裝配成一個(gè)可執(zhí)行數(shù)庫(kù)的函數(shù)裝配成一個(gè)可執(zhí)行C程序。圖程序。圖5.1顯示了顯示了C語(yǔ)言程序的基本結(jié)構(gòu)。語(yǔ)言程序的基本結(jié)構(gòu)。 6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組17n圖圖5.1 C語(yǔ)言程序的基本結(jié)構(gòu)語(yǔ)言程序的基本結(jié)構(gòu) 6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組185.2 5.2 函數(shù)的定義與函數(shù)的

20、聲明函數(shù)的定義與函數(shù)的聲明 n 程序中若要使用自定義函數(shù)實(shí)現(xiàn)所需的功能,程序中若要使用自定義函數(shù)實(shí)現(xiàn)所需的功能,需要做三件事:需要做三件事: 按語(yǔ)法規(guī)則編寫完成指定任務(wù)的函數(shù),即按語(yǔ)法規(guī)則編寫完成指定任務(wù)的函數(shù),即定義函數(shù);定義函數(shù); 有些情況下在調(diào)用函數(shù)之前要進(jìn)行函數(shù)聲有些情況下在調(diào)用函數(shù)之前要進(jìn)行函數(shù)聲明;明; 在需要使用函數(shù)時(shí)調(diào)用函數(shù)在需要使用函數(shù)時(shí)調(diào)用函數(shù) 6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組195.2.1 5.2.1 函數(shù)的定義函數(shù)的定義 函數(shù)定義的一般形式為:函數(shù)定義的一般形式為:類型名類型名 函數(shù)名(參數(shù)列表)函數(shù)名(參數(shù)列表) 聲明部分聲明部分 語(yǔ)句部分語(yǔ)句部分

21、6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組20n類型名說(shuō)明函數(shù)返回值(即出口參數(shù))的數(shù)據(jù)類型類型名說(shuō)明函數(shù)返回值(即出口參數(shù))的數(shù)據(jù)類型(簡(jiǎn)稱為函數(shù)的類型或函數(shù)值的類型),可以是除(簡(jiǎn)稱為函數(shù)的類型或函數(shù)值的類型),可以是除數(shù)組以外的任何類型。當(dāng)返回值類型為數(shù)組以外的任何類型。當(dāng)返回值類型為void,函數(shù),函數(shù)將不返回任何值。將不返回任何值。 n參數(shù)列表說(shuō)明函數(shù)入口參數(shù)的名稱、類型和個(gè)數(shù),參數(shù)列表說(shuō)明函數(shù)入口參數(shù)的名稱、類型和個(gè)數(shù),它是一個(gè)用逗號(hào)分隔的變量名及其類型列表,它描它是一個(gè)用逗號(hào)分隔的變量名及其類型列表,它描述了在調(diào)用函數(shù)時(shí)函數(shù)所接收的參數(shù)。一個(gè)函數(shù)可述了在調(diào)用函數(shù)時(shí)函數(shù)所

22、接收的參數(shù)。一個(gè)函數(shù)可能沒(méi)有參數(shù),在沒(méi)有參數(shù)的情況下,參數(shù)列表說(shuō)明能沒(méi)有參數(shù),在沒(méi)有參數(shù)的情況下,參數(shù)列表說(shuō)明為為void,否則必須明確地列出每一個(gè)參數(shù)的類型。,否則必須明確地列出每一個(gè)參數(shù)的類型。 6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組21n在參數(shù)列表中定義的參數(shù)稱為形式參數(shù)(簡(jiǎn)稱形參),用以在參數(shù)列表中定義的參數(shù)稱為形式參數(shù)(簡(jiǎn)稱形參),用以強(qiáng)調(diào)它作為占位符的角色。形參是函數(shù)要處理的數(shù)據(jù),在函強(qiáng)調(diào)它作為占位符的角色。形參是函數(shù)要處理的數(shù)據(jù),在函數(shù)調(diào)用時(shí)要將實(shí)際值傳遞給形參。在定義變量時(shí),相同類型數(shù)調(diào)用時(shí)要將實(shí)際值傳遞給形參。在定義變量時(shí),相同類型的變量可以用一個(gè)數(shù)據(jù)類型關(guān)鍵字

23、定義。但是,和變量定義的變量可以用一個(gè)數(shù)據(jù)類型關(guān)鍵字定義。但是,和變量定義不同的是,每一個(gè)形參都必須有數(shù)據(jù)類型和名字。例如:不同的是,每一個(gè)形參都必須有數(shù)據(jù)類型和名字。例如:double power(int x, int n) /* 正確的函數(shù)參數(shù)定義正確的函數(shù)參數(shù)定義 */double power(int x, n) /* 錯(cuò)誤,錯(cuò)誤,n必須指定類型必須指定類型 */int GetNum (void) /* 參數(shù)表為空的函數(shù)參數(shù)表為空的函數(shù) */GetNum (void) /* C89中默認(rèn)返回中默認(rèn)返回int,但,但C99不允許不允許 */n良好的編程風(fēng)格是:在每個(gè)函數(shù)的頂端用良好的編程風(fēng)

24、格是:在每個(gè)函數(shù)的頂端用“/*/”格式格式增加函數(shù)頭部注釋,如例增加函數(shù)頭部注釋,如例5.1所示。為了節(jié)省篇幅,本書后面所示。為了節(jié)省篇幅,本書后面的例子采用簡(jiǎn)化的注釋,希望讀者寫程序時(shí)按例的例子采用簡(jiǎn)化的注釋,希望讀者寫程序時(shí)按例5.1的格式寫的格式寫頭部注釋。頭部注釋。n為函數(shù)命名時(shí),要選擇有意義的名稱,以增加程序的可讀性,為函數(shù)命名時(shí),要選擇有意義的名稱,以增加程序的可讀性,還可避免過(guò)多地使用注釋。還可避免過(guò)多地使用注釋。Windows風(fēng)格函數(shù)名用小寫字母風(fēng)格函數(shù)名用小寫字母命名,每個(gè)詞的第一個(gè)字母大寫,通常用命名,每個(gè)詞的第一個(gè)字母大寫,通常用“動(dòng)詞動(dòng)詞”或者或者“動(dòng)動(dòng)詞詞+名詞名詞”

25、(動(dòng)賓詞組)形式。(動(dòng)賓詞組)形式。6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組225.2.2 5.2.2 函數(shù)的返回值函數(shù)的返回值 nreturn語(yǔ)句可以是如下兩種形式之一:語(yǔ)句可以是如下兩種形式之一:(1)return ; /* void函數(shù)函數(shù) */(2)return 表達(dá)式表達(dá)式 ; /* 非非void函數(shù)函數(shù) */ nvoid函數(shù)也可以不包含函數(shù)也可以不包含return語(yǔ)句。如果沒(méi)有語(yǔ)句。如果沒(méi)有return語(yǔ)句,當(dāng)執(zhí)行到函數(shù)結(jié)束的右花括號(hào)時(shí),控語(yǔ)句,當(dāng)執(zhí)行到函數(shù)結(jié)束的右花括號(hào)時(shí),控制返回到調(diào)用處,把這種情況稱為離開(kāi)結(jié)束。制返回到調(diào)用處,把這種情況稱為離開(kāi)結(jié)束。 n表達(dá)式值的

26、類型應(yīng)該與函數(shù)定義的返回值類型一致,表達(dá)式值的類型應(yīng)該與函數(shù)定義的返回值類型一致,如果不相同,就把表達(dá)式值的類型自動(dòng)轉(zhuǎn)換為函數(shù)如果不相同,就把表達(dá)式值的類型自動(dòng)轉(zhuǎn)換為函數(shù)的類型的類型 。 6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組23函數(shù)返回的值,程序可以使用它,函數(shù)返回的值,程序可以使用它,也可以不使用它也可以不使用它while() getchar(); /* 返回值不被使用返回值不被使用 */ c=getchar(); /* 返回值被使用返回值被使用 */ 6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組24【例【例5.25.2】寫一個(gè)函數(shù)】寫一個(gè)函數(shù)IsPrime IsPr

27、ime nIsPrime判斷整數(shù)判斷整數(shù)n是否為素?cái)?shù)。如果是否為素?cái)?shù)。如果n是素是素?cái)?shù),則返回?cái)?shù),則返回1;如果;如果n不是素?cái)?shù),則返回不是素?cái)?shù),則返回0。n源程序源程序ex5_在一個(gè)函數(shù)中可以有多個(gè)在一個(gè)函數(shù)中可以有多個(gè)return語(yǔ)句,此種語(yǔ)句,此種情況下的情況下的return語(yǔ)句通常被作為選擇語(yǔ)句的語(yǔ)句通常被作為選擇語(yǔ)句的子句出現(xiàn),最終被執(zhí)行的只是其中的一個(gè)。因子句出現(xiàn),最終被執(zhí)行的只是其中的一個(gè)。因?yàn)?,一旦某個(gè)為,一旦某個(gè)return語(yǔ)句被執(zhí)行,控制立即語(yǔ)句被執(zhí)行,控制立即返回到調(diào)用處,其后的代碼不可能被執(zhí)行。返回到調(diào)用處,其后的代碼不可能被執(zhí)行。 6/15/2021華中科技大學(xué)計(jì)算機(jī)

28、學(xué)院C語(yǔ)言課程組255.2.3 5.2.3 函數(shù)的聲明函數(shù)的聲明 n1函數(shù)定義起函數(shù)聲明的作用函數(shù)定義起函數(shù)聲明的作用 n要利用函數(shù)定義起函數(shù)聲明的作用,在調(diào)用要利用函數(shù)定義起函數(shù)聲明的作用,在調(diào)用函數(shù)之前,必須給出調(diào)用函數(shù)的函數(shù)定義。函數(shù)之前,必須給出調(diào)用函數(shù)的函數(shù)定義。例如,將例如,將main函數(shù)的定義放在最后。函數(shù)的定義放在最后。 #include#include #include #include #define MAX_NUMBER 1000 int GetNum(void) void GuessNum(int x ) int main(void) 6/15/2021華中科技大學(xué)計(jì)算

29、機(jī)學(xué)院C語(yǔ)言課程組262 2函數(shù)原型函數(shù)原型n 函數(shù)定義出現(xiàn)在函數(shù)調(diào)用后函數(shù)定義出現(xiàn)在函數(shù)調(diào)用后n 被調(diào)用函數(shù)在其它文件中定義被調(diào)用函數(shù)在其它文件中定義n 必須在函數(shù)調(diào)用之前給出函數(shù)原型。必須在函數(shù)調(diào)用之前給出函數(shù)原型。6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組27函數(shù)原型的一般形式函數(shù)原型的一般形式 類型名類型名 函數(shù)名(參數(shù)類型表);函數(shù)名(參數(shù)類型表);n 參數(shù)類型表通常是用逗號(hào)隔開(kāi)的形參類型列參數(shù)類型表通常是用逗號(hào)隔開(kāi)的形參類型列表,而形參名可以省略。例如,表,而形參名可以省略。例如, void GuessNum(int) ; 等價(jià)于等價(jià)于 void GuessNum(int

30、 x ) ; n 無(wú)參函數(shù)的函數(shù)原型參數(shù)表必須指定為無(wú)參函數(shù)的函數(shù)原型參數(shù)表必須指定為void 6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組28函數(shù)原型的作用函數(shù)原型的作用n 函數(shù)原型告訴編譯器函數(shù)返回值的數(shù)據(jù)類型,函數(shù)原型告訴編譯器函數(shù)返回值的數(shù)據(jù)類型,傳遞給函數(shù)的參數(shù)個(gè)數(shù)、參數(shù)類型和參數(shù)順序。傳遞給函數(shù)的參數(shù)個(gè)數(shù)、參數(shù)類型和參數(shù)順序。編譯器用函數(shù)原型校驗(yàn)函數(shù)調(diào)用編譯器用函數(shù)原型校驗(yàn)函數(shù)調(diào)用, 強(qiáng)制轉(zhuǎn)換傳強(qiáng)制轉(zhuǎn)換傳遞的參數(shù)類型遞的參數(shù)類型,從而避免錯(cuò)誤的函數(shù)調(diào)用導(dǎo)致從而避免錯(cuò)誤的函數(shù)調(diào)用導(dǎo)致的致命運(yùn)行錯(cuò)誤或微妙而難以檢測(cè)的非致命邏的致命運(yùn)行錯(cuò)誤或微妙而難以檢測(cè)的非致命邏輯錯(cuò)誤。例如,

31、輯錯(cuò)誤。例如,n printf (%.1f n, sqrt(4) ) ;n(1)包含了包含了math.h,輸出,輸出 2.0 */n(2)沒(méi)有包含沒(méi)有包含math.h,函數(shù)調(diào)用,函數(shù)調(diào)用sqrt(4)不會(huì)不會(huì)產(chǎn)生正確的值。產(chǎn)生正確的值。 6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組293 3遺漏函數(shù)原型遺漏函數(shù)原型 n 編譯器首次遇到?jīng)]有聲明的函數(shù)調(diào)用時(shí),將構(gòu)造一編譯器首次遇到?jīng)]有聲明的函數(shù)調(diào)用時(shí),將構(gòu)造一個(gè)缺省聲明并繼續(xù)編譯:個(gè)缺省聲明并繼續(xù)編譯:n int f(); /*函數(shù)是函數(shù)是int類型,但不給出參數(shù)表信息類型,但不給出參數(shù)表信息*/n (1) 函數(shù)類型不是函數(shù)類型不是int

32、,給出一個(gè)錯(cuò)誤提示:,給出一個(gè)錯(cuò)誤提示:n Type mismatch in redeclaration of fn (2) 函數(shù)類型是函數(shù)類型是int,就不給出錯(cuò)誤提示。編譯器對(duì),就不給出錯(cuò)誤提示。編譯器對(duì)參數(shù)類型不作檢查,把正確類型的參數(shù)傳遞給函數(shù)參數(shù)類型不作檢查,把正確類型的參數(shù)傳遞給函數(shù)是程序員的責(zé)任。假設(shè)函數(shù)是程序員的責(zé)任。假設(shè)函數(shù)f只有一個(gè)類型為只有一個(gè)類型為int的參的參數(shù),函數(shù)調(diào)用數(shù),函數(shù)調(diào)用f (2)會(huì)產(chǎn)生正確的值,而函數(shù)調(diào)用會(huì)產(chǎn)生正確的值,而函數(shù)調(diào)用f(2.5)將產(chǎn)生錯(cuò)誤的運(yùn)行結(jié)果。將產(chǎn)生錯(cuò)誤的運(yùn)行結(jié)果。 6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組30良好的編程風(fēng)

33、格良好的編程風(fēng)格n 在函數(shù)調(diào)用之前必須給出它的函數(shù)定義、函在函數(shù)調(diào)用之前必須給出它的函數(shù)定義、函數(shù)原型或兩者都給出。數(shù)原型或兩者都給出。n 引入標(biāo)準(zhǔn)頭文件的主要原因是它含有函數(shù)原引入標(biāo)準(zhǔn)頭文件的主要原因是它含有函數(shù)原型。型。 6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組315.2.4 5.2.4 新增關(guān)鍵字新增關(guān)鍵字inlineinline和和_Noreturn _Noreturn ninline是是C99增加的關(guān)鍵字,它用在函數(shù)定義的前面,增加的關(guān)鍵字,它用在函數(shù)定義的前面,告訴編譯器對(duì)該函數(shù)的調(diào)用進(jìn)行內(nèi)聯(lián)優(yōu)化,這意味告訴編譯器對(duì)該函數(shù)的調(diào)用進(jìn)行內(nèi)聯(lián)優(yōu)化,這意味著編譯器將采用插入的方

34、式處理函數(shù)調(diào)用,而不是著編譯器將采用插入的方式處理函數(shù)調(diào)用,而不是采用函數(shù)調(diào)用的方式,但是,這只是一個(gè)請(qǐng)求,編采用函數(shù)調(diào)用的方式,但是,這只是一個(gè)請(qǐng)求,編譯器可以忽略這個(gè)請(qǐng)求。只有支持譯器可以忽略這個(gè)請(qǐng)求。只有支持C99的編譯器才的編譯器才能識(shí)別能識(shí)別inline。n_Noreturn是是C11增加的關(guān)鍵字,它用在函數(shù)定義增加的關(guān)鍵字,它用在函數(shù)定義的前面,告訴編譯器這個(gè)函數(shù)不會(huì)返回到調(diào)用處,的前面,告訴編譯器這個(gè)函數(shù)不會(huì)返回到調(diào)用處,其結(jié)果是讓編譯器知道調(diào)用說(shuō)明為其結(jié)果是讓編譯器知道調(diào)用說(shuō)明為_(kāi)Noreturn的函的函數(shù)之后的代碼不可到達(dá)。數(shù)之后的代碼不可到達(dá)。 6/15/2021華中科技大

35、學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組32關(guān)鍵字關(guān)鍵字inlineinlineinline int add(int a, int b) return a+b; n那么,在程序編譯時(shí),編譯器將程序中出現(xiàn)的內(nèi)聯(lián)那么,在程序編譯時(shí),編譯器將程序中出現(xiàn)的內(nèi)聯(lián)函數(shù)的調(diào)用表達(dá)式用內(nèi)聯(lián)函數(shù)的函數(shù)體來(lái)進(jìn)行替換。函數(shù)的調(diào)用表達(dá)式用內(nèi)聯(lián)函數(shù)的函數(shù)體來(lái)進(jìn)行替換。這將不會(huì)產(chǎn)生調(diào)用和返回所帶來(lái)的開(kāi)銷,節(jié)約了時(shí)這將不會(huì)產(chǎn)生調(diào)用和返回所帶來(lái)的開(kāi)銷,節(jié)約了時(shí)間,但是由于在編譯時(shí)函數(shù)體中的代碼被替代到程間,但是由于在編譯時(shí)函數(shù)體中的代碼被替代到程序中,因此會(huì)增加目標(biāo)程序代碼量,進(jìn)而增加空間序中,因此會(huì)增加目標(biāo)程序代碼量,進(jìn)而增加空間開(kāi)銷,可

36、見(jiàn)它是以增加目標(biāo)代碼為代價(jià)而換取時(shí)間開(kāi)銷,可見(jiàn)它是以增加目標(biāo)代碼為代價(jià)而換取時(shí)間上的節(jié)省。上的節(jié)省。6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組33關(guān)于關(guān)于inlineinlineninline函數(shù)僅僅是對(duì)編譯器的建議,最后能否真正內(nèi)聯(lián),看函數(shù)僅僅是對(duì)編譯器的建議,最后能否真正內(nèi)聯(lián),看編譯器的意思,它如果認(rèn)為函數(shù)不復(fù)雜,能在調(diào)用點(diǎn)展開(kāi),編譯器的意思,它如果認(rèn)為函數(shù)不復(fù)雜,能在調(diào)用點(diǎn)展開(kāi),就會(huì)真正內(nèi)聯(lián)。就會(huì)真正內(nèi)聯(lián)。n因?yàn)閮?nèi)聯(lián)函數(shù)要在調(diào)用點(diǎn)展開(kāi),所以編譯器必須隨處可見(jiàn)內(nèi)因?yàn)閮?nèi)聯(lián)函數(shù)要在調(diào)用點(diǎn)展開(kāi),所以編譯器必須隨處可見(jiàn)內(nèi)聯(lián)函數(shù)的定義,否則,就成了非內(nèi)聯(lián)函數(shù)的調(diào)用了。所以,聯(lián)函數(shù)的定義,否

37、則,就成了非內(nèi)聯(lián)函數(shù)的調(diào)用了。所以,內(nèi)聯(lián)函數(shù)必須在調(diào)用之前定義,并且在每個(gè)調(diào)用了內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù)必須在調(diào)用之前定義,并且在每個(gè)調(diào)用了內(nèi)聯(lián)函數(shù)的文件中都要有該內(nèi)聯(lián)函數(shù)的定義,因此,通常將內(nèi)聯(lián)函數(shù)的文件中都要有該內(nèi)聯(lián)函數(shù)的定義,因此,通常將內(nèi)聯(lián)函數(shù)定義放在頭文件中共享。定義放在頭文件中共享。inline函數(shù)是可以被重復(fù)定義的。函數(shù)是可以被重復(fù)定義的。ninline的使用是有限制的,內(nèi)聯(lián)函數(shù)應(yīng)該簡(jiǎn)潔,只有幾個(gè)語(yǔ)的使用是有限制的,內(nèi)聯(lián)函數(shù)應(yīng)該簡(jiǎn)潔,只有幾個(gè)語(yǔ)句,如果語(yǔ)句較多,不適合定義為內(nèi)聯(lián)函數(shù)。內(nèi)聯(lián)函數(shù)體中,句,如果語(yǔ)句較多,不適合定義為內(nèi)聯(lián)函數(shù)。內(nèi)聯(lián)函數(shù)體中,不能有循環(huán)語(yǔ)句、不能有循環(huán)語(yǔ)句、if語(yǔ)

38、句或語(yǔ)句或switch語(yǔ)句,否則,即使函數(shù)定語(yǔ)句,否則,即使函數(shù)定義時(shí)使用了義時(shí)使用了inline關(guān)鍵字,編譯器也會(huì)把該函數(shù)作為普通函關(guān)鍵字,編譯器也會(huì)把該函數(shù)作為普通函數(shù)處理。數(shù)處理。6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組34關(guān)鍵字關(guān)鍵字_Noreturn_Noreturnn_Noreturn用在函數(shù)定義的前面,告訴編譯器這個(gè)函數(shù)不會(huì)用在函數(shù)定義的前面,告訴編譯器這個(gè)函數(shù)不會(huì)返回到調(diào)用處。例如:返回到調(diào)用處。例如:_Noreturn void f () /* f函數(shù)沒(méi)有返回,所以說(shuō)明為函數(shù)沒(méi)有返回,所以說(shuō)明為_(kāi)Noreturn */ abort(); /* 終止程序終止程序 *

39、/_Noreturn void g (int i) /* 假如假如 i 0) abort(); 6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組355.3 5.3 函數(shù)調(diào)用與參數(shù)傳遞函數(shù)調(diào)用與參數(shù)傳遞 5.3.1 函數(shù)調(diào)用函數(shù)調(diào)用 1函數(shù)調(diào)用的形式函數(shù)調(diào)用的形式 函數(shù)名(實(shí)參列表)函數(shù)名(實(shí)參列表)實(shí)參是一個(gè)表達(dá)式實(shí)參是一個(gè)表達(dá)式 ,對(duì)于無(wú)函數(shù),調(diào)用形式對(duì)于無(wú)函數(shù),調(diào)用形式 : 函數(shù)名()函數(shù)名() 6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組36函數(shù)調(diào)用的形式函數(shù)調(diào)用的形式(1) 作為表達(dá)式語(yǔ)句出現(xiàn)。作為表達(dá)式語(yǔ)句出現(xiàn)。 GuessNum( ); putchar(c);(2)作為

40、表達(dá)式中的一個(gè)操作數(shù)出現(xiàn)。例如:)作為表達(dá)式中的一個(gè)操作數(shù)出現(xiàn)。例如: c=getchar() magic = GetNum( );(3)作為函數(shù)調(diào)用的一個(gè)實(shí)參出現(xiàn),即嵌套調(diào)用。)作為函數(shù)調(diào)用的一個(gè)實(shí)參出現(xiàn),即嵌套調(diào)用。 printf(%10.0f,sqrt(x); while(putchar (getchar()!=# );6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組372. 2. 函數(shù)調(diào)用的執(zhí)行過(guò)程函數(shù)調(diào)用的執(zhí)行過(guò)程 n為了說(shuō)明函數(shù)的調(diào)用過(guò)程,請(qǐng)看下面程序。為了說(shuō)明函數(shù)的調(diào)用過(guò)程,請(qǐng)看下面程序。【例【例5.3】 編寫程序?qū)崿F(xiàn)如下功能:分列整齊地顯示整數(shù)編寫程序?qū)崿F(xiàn)如下功能:分列整齊

41、地顯示整數(shù)1到到10的的2至至5次冪。輸出結(jié)次冪。輸出結(jié)果如下所示:果如下所示: Int Square Cube Quartic Quintic 1 1 1 1 1 2 4 8 16 32 3 9 27 81 243 4 16 64 256 1024 5 25 125 625 3125 6 36 216 1296 7776 7 49 343 2401 16807 8 64 512 4096 32768 9 81 729 6561 59049 10 100 1000 10000 100000 n源程序源程序ex5_3.c6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組38程序分析程序分析n該

42、程序由主函數(shù)該程序由主函數(shù)main和用戶自定義函數(shù)和用戶自定義函數(shù)power組成。組成。main函數(shù)在函數(shù)在printf語(yǔ)句中嵌套調(diào)用了語(yǔ)句中嵌套調(diào)用了power函數(shù)。程序從函數(shù)。程序從main函函數(shù)開(kāi)始執(zhí)行,當(dāng)執(zhí)行到數(shù)開(kāi)始執(zhí)行,當(dāng)執(zhí)行到printf(%10.0f, power(i,j); 時(shí),時(shí),首先調(diào)用函數(shù)首先調(diào)用函數(shù)power,這時(shí)系統(tǒng)為形參,這時(shí)系統(tǒng)為形參x和和n分配分配2或或4字節(jié)的字節(jié)的存儲(chǔ)單元,將實(shí)參存儲(chǔ)單元,將實(shí)參i的值傳遞給形參的值傳遞給形參x,將實(shí)參,將實(shí)參j的值傳遞給形的值傳遞給形參參n,然后把程序控制轉(zhuǎn)移到函數(shù),然后把程序控制轉(zhuǎn)移到函數(shù)power,執(zhí)行其函數(shù)體內(nèi),執(zhí)行其

43、函數(shù)體內(nèi)的語(yǔ)句,其中的的語(yǔ)句,其中的for語(yǔ)句計(jì)算語(yǔ)句計(jì)算xn ,并把計(jì)算結(jié)果保存在變量,并把計(jì)算結(jié)果保存在變量p中,語(yǔ)句中,語(yǔ)句return p;將程序控制返回到調(diào)用處將程序控制返回到調(diào)用處(即即main函數(shù)中函數(shù)中的的printf(%10.0f, power(i,j);語(yǔ)句;語(yǔ)句),同時(shí)把,同時(shí)把p的值送的值送回,至此,回,至此,power函數(shù)調(diào)用執(zhí)行完畢,系統(tǒng)釋放形參所占據(jù)函數(shù)調(diào)用執(zhí)行完畢,系統(tǒng)釋放形參所占據(jù)的存儲(chǔ)單元。程序從的存儲(chǔ)單元。程序從main函數(shù)調(diào)用點(diǎn)繼續(xù)執(zhí)行,輸出返回的函數(shù)調(diào)用點(diǎn)繼續(xù)執(zhí)行,輸出返回的p值。值。nmain函數(shù)用二重函數(shù)用二重for循環(huán)結(jié)構(gòu)重復(fù)調(diào)用了循環(huán)結(jié)構(gòu)重復(fù)調(diào)

44、用了power函數(shù)函數(shù)40次,次,每次傳遞給形參的值不同即可計(jì)算出題目要求的所有每次傳遞給形參的值不同即可計(jì)算出題目要求的所有xn值值(x=110,n=25)。)。 6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組393 3實(shí)參的求值順序?qū)崊⒌那笾淀樞騨 實(shí)參的求值順序由具體實(shí)現(xiàn)確定,有的按從實(shí)參的求值順序由具體實(shí)現(xiàn)確定,有的按從左至右的順序計(jì)算,有的按從右至左的順序計(jì)左至右的順序計(jì)算,有的按從右至左的順序計(jì)算算 a=1; power(a,a+) -從左至右:從左至右:power(1,1) -從右至左:從右至左:power(2,1) (多數(shù)多數(shù) ) 為了保證程序清晰、可移植,應(yīng)避免使用會(huì)引

45、為了保證程序清晰、可移植,應(yīng)避免使用會(huì)引起副作用的實(shí)參表達(dá)式起副作用的實(shí)參表達(dá)式 .6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組405.3.2 5.3.2 參數(shù)的值傳遞參數(shù)的值傳遞 n 參數(shù)的傳遞方式是參數(shù)的傳遞方式是“值傳遞值傳遞”,實(shí)參的值單,實(shí)參的值單向傳遞給相應(yīng)的形參。如果實(shí)參、形參都是向傳遞給相應(yīng)的形參。如果實(shí)參、形參都是x,被調(diào)用函數(shù)不能改變實(shí)參被調(diào)用函數(shù)不能改變實(shí)參x的值。的值。6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組41【例【例5.45.4】改寫例】改寫例5.35.3來(lái)說(shuō)明值傳遞概念。來(lái)說(shuō)明值傳遞概念。 n 源程序源程序ex5_由于參數(shù)是值傳遞,由于參數(shù)是值

46、傳遞,power函數(shù)中的形參函數(shù)中的形參n可以當(dāng)普可以當(dāng)普通的局部變量使用,被用作臨時(shí)變量,控制通的局部變量使用,被用作臨時(shí)變量,控制for的循的循環(huán)次數(shù),這樣就不再需要引入局部變量環(huán)次數(shù),這樣就不再需要引入局部變量i,從而使程,從而使程序更簡(jiǎn)潔。主函數(shù)序更簡(jiǎn)潔。主函數(shù)main中的局部變量可以與函數(shù)中的局部變量可以與函數(shù)power的形參的形參x、n同名,但它們的作用域不同,只同名,但它們的作用域不同,只能作用于定義它的函數(shù)。當(dāng)?shù)谀茏饔糜诙x它的函數(shù)。當(dāng)?shù)?次執(zhí)行函數(shù)調(diào)用次執(zhí)行函數(shù)調(diào)用power(x,n)時(shí),把時(shí),把x的值(即的值(即1)傳遞給形參)傳遞給形參x,把,把n的值(即的值(即2)傳遞

47、給形參)傳遞給形參n,在函數(shù),在函數(shù)power內(nèi)改變了內(nèi)改變了形參形參n的值(由的值(由2變化為變化為0),但并不能改變函數(shù)),但并不能改變函數(shù)main中變量中變量n的值。的值。 6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組42傳地址(引用)調(diào)用傳地址(引用)調(diào)用n傳地址(引用)調(diào)用是將變量的地址傳遞給函傳地址(引用)調(diào)用是將變量的地址傳遞給函數(shù),函數(shù)既可以使用,也可以改變實(shí)參變量的數(shù),函數(shù)既可以使用,也可以改變實(shí)參變量的值。標(biāo)準(zhǔn)庫(kù)函數(shù)值。標(biāo)準(zhǔn)庫(kù)函數(shù)scanf就是一個(gè)引用調(diào)用的例就是一個(gè)引用調(diào)用的例子,通過(guò)地址實(shí)參返回一個(gè)或多個(gè)數(shù)據(jù)。程序子,通過(guò)地址實(shí)參返回一個(gè)或多個(gè)數(shù)據(jù)。程序員也可以

48、定義這種帶有地址形參的函數(shù),這部員也可以定義這種帶有地址形參的函數(shù),這部分內(nèi)容將在第分內(nèi)容將在第9章中介紹。章中介紹。 6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組435.4 5.4 作用域與可見(jiàn)性作用域與可見(jiàn)性n作用域和可見(jiàn)性是對(duì)一個(gè)問(wèn)題的兩種角度的思考。作用域和可見(jiàn)性是對(duì)一個(gè)問(wèn)題的兩種角度的思考。n作用域是指標(biāo)識(shí)符(變量或函數(shù))的有效范圍,也作用域是指標(biāo)識(shí)符(變量或函數(shù))的有效范圍,也就是指程序正文中可以使用該標(biāo)識(shí)符的那部分程序就是指程序正文中可以使用該標(biāo)識(shí)符的那部分程序段。段。n有局部和全局兩種作用域,局部作用域表示只能在有局部和全局兩種作用域,局部作用域表示只能在一定的范圍內(nèi)起

49、作用,只能被一個(gè)程序塊訪問(wèn),全一定的范圍內(nèi)起作用,只能被一個(gè)程序塊訪問(wèn),全局作用域表示可以在整個(gè)程序的所有范圍內(nèi)起作用,局作用域表示可以在整個(gè)程序的所有范圍內(nèi)起作用,可由程序中的部分或所有函數(shù)共享,程序塊是帶有可由程序中的部分或所有函數(shù)共享,程序塊是帶有說(shuō)明的復(fù)合語(yǔ)句(包括函數(shù)體)。代碼中的變量,說(shuō)明的復(fù)合語(yǔ)句(包括函數(shù)體)。代碼中的變量,按照作用域可分為局部變量和全局變量。函數(shù)都是按照作用域可分為局部變量和全局變量。函數(shù)都是全局的。全局的。 6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組445.4.1 5.4.1 局部變量和全局變量局部變量和全局變量 n局部變量:在函數(shù)內(nèi)部定義的變量,

50、作用域是局部變量:在函數(shù)內(nèi)部定義的變量,作用域是定義該變量的程序塊,程序塊是帶有說(shuō)明的復(fù)定義該變量的程序塊,程序塊是帶有說(shuō)明的復(fù)合語(yǔ)句(包括函數(shù)體)。不同函數(shù)可同名,同合語(yǔ)句(包括函數(shù)體)。不同函數(shù)可同名,同一函數(shù)內(nèi)不同程序塊可同名。形式參數(shù)是局部一函數(shù)內(nèi)不同程序塊可同名。形式參數(shù)是局部變量。變量。n外部變量:在函數(shù)外部定義的變量,其作用域外部變量:在函數(shù)外部定義的變量,其作用域從其定義處開(kāi)始一直到其所在文件的末尾,可從其定義處開(kāi)始一直到其所在文件的末尾,可由程序中的部分或所有函數(shù)共享。由程序中的部分或所有函數(shù)共享。6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組45externexter

51、n聲明聲明 n在函數(shù)中使用外部變量,一般要對(duì)該變量進(jìn)行引用在函數(shù)中使用外部變量,一般要對(duì)該變量進(jìn)行引用性聲明,說(shuō)明它的類型。只有在函數(shù)內(nèi)經(jīng)過(guò)引用性性聲明,說(shuō)明它的類型。只有在函數(shù)內(nèi)經(jīng)過(guò)引用性聲明的外部變量才能使用,外部變量的說(shuō)明符為聲明的外部變量才能使用,外部變量的說(shuō)明符為extern。但在一個(gè)外部變量定義之后的函數(shù)內(nèi)使用。但在一個(gè)外部變量定義之后的函數(shù)內(nèi)使用可不再加以可不再加以extern聲明。聲明。n【例【例5.5】 改寫例改寫例5.1,把,把magic定義為外部變量。定義為外部變量。這需要修改函數(shù)這需要修改函數(shù)GuessNum的調(diào)用、原型和定義。的調(diào)用、原型和定義。 n源程序源程序ex5

52、_5.c6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組46程序分析程序分析nmagic是在函數(shù)外部定義的,它是外部變量,是在函數(shù)外部定義的,它是外部變量,由于函數(shù)由于函數(shù)main和和GuessNum使用了它,所以使用了它,所以在這兩個(gè)函數(shù)中編寫了一條在這兩個(gè)函數(shù)中編寫了一條extern聲明語(yǔ)句,聲明語(yǔ)句,該聲明語(yǔ)句除了在前面加了關(guān)鍵字該聲明語(yǔ)句除了在前面加了關(guān)鍵字extern外,外,其余與該外部變量的定義相同。但是,在該例其余與該外部變量的定義相同。但是,在該例中,兩條中,兩條extern聲明是多余的,均可以省略,聲明是多余的,均可以省略,因?yàn)橐驗(yàn)閙agic的定義出現(xiàn)在函數(shù)的定義出現(xiàn)在函

53、數(shù)main和和GuessNum之前。之前。 6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組47外部變量的定義性聲明和引用性聲明外部變量的定義性聲明和引用性聲明n局部變量只有定義性聲明,沒(méi)有引用性聲明。而外局部變量只有定義性聲明,沒(méi)有引用性聲明。而外部變量有定義性聲明和引用性聲明,兩者具有嚴(yán)格部變量有定義性聲明和引用性聲明,兩者具有嚴(yán)格的區(qū)別。外部變量的定義必須在所有的函數(shù)之外,的區(qū)別。外部變量的定義必須在所有的函數(shù)之外,且只能定義一次,目的是為之分配存儲(chǔ)單元。外部且只能定義一次,目的是為之分配存儲(chǔ)單元。外部變量的引用性聲明既可以出現(xiàn)在函數(shù)內(nèi),也可以出變量的引用性聲明既可以出現(xiàn)在函數(shù)內(nèi),也

54、可以出現(xiàn)在函數(shù)外,而且可以出現(xiàn)多次,僅用于通報(bào)變量現(xiàn)在函數(shù)外,而且可以出現(xiàn)多次,僅用于通報(bào)變量的類型,并不分配存儲(chǔ)單元,只是表明在代碼中要的類型,并不分配存儲(chǔ)單元,只是表明在代碼中要按聲明的類型使用它。外部變量的初始化只能出現(xiàn)按聲明的類型使用它。外部變量的初始化只能出現(xiàn)在其定義中。在其定義中。 6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組48外部變量外部變量 PK PK 形式參數(shù)形式參數(shù)n在在C程序的不同源文件之間,或者在同一源文件的不同函數(shù)之程序的不同源文件之間,或者在同一源文件的不同函數(shù)之間必須共享變量時(shí),外部變量是很有用的。函數(shù)之間的數(shù)據(jù)間必須共享變量時(shí),外部變量是很有用的。函數(shù)

55、之間的數(shù)據(jù)聯(lián)系除了通過(guò)形式參數(shù)外,也可以利用外部變量。聯(lián)系除了通過(guò)形式參數(shù)外,也可以利用外部變量。n從結(jié)構(gòu)化程序設(shè)計(jì)的觀點(diǎn)來(lái)看,不要過(guò)于依賴外部變量,因從結(jié)構(gòu)化程序設(shè)計(jì)的觀點(diǎn)來(lái)看,不要過(guò)于依賴外部變量,因?yàn)檫@將使函數(shù)的獨(dú)立性降低。很難在其他程序中復(fù)用依賴于為這將使函數(shù)的獨(dú)立性降低。很難在其他程序中復(fù)用依賴于外部變量的函數(shù),為了在另一個(gè)程序中使用該函數(shù),必須帶外部變量的函數(shù),為了在另一個(gè)程序中使用該函數(shù),必須帶上此函數(shù)需要的外部變量。在程序維護(hù)期間,如果改變外部上此函數(shù)需要的外部變量。在程序維護(hù)期間,如果改變外部變量(比方說(shuō)改變它的類型),那么將需要檢查程序中的每變量(比方說(shuō)改變它的類型),那么

56、將需要檢查程序中的每個(gè)函數(shù),以確認(rèn)該變化如何對(duì)函數(shù)產(chǎn)生影響。如果外部變量個(gè)函數(shù),以確認(rèn)該變化如何對(duì)函數(shù)產(chǎn)生影響。如果外部變量被賦了錯(cuò)誤的值,可能很難確定出錯(cuò)的函數(shù)。被賦了錯(cuò)誤的值,可能很難確定出錯(cuò)的函數(shù)。n在大多數(shù)情況下,對(duì)函數(shù)而言,通過(guò)形式參數(shù)進(jìn)行通信比通在大多數(shù)情況下,對(duì)函數(shù)而言,通過(guò)形式參數(shù)進(jìn)行通信比通過(guò)外部變量通信的方法更好。這樣有助于提高函數(shù)的通用性,過(guò)外部變量通信的方法更好。這樣有助于提高函數(shù)的通用性,降低副作用。降低副作用。 6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組495.4.2 5.4.2 作用域規(guī)則作用域規(guī)則 (1)文件范圍。其作用域開(kāi)始于文件開(kāi)頭,結(jié)束于文)文件

57、范圍。其作用域開(kāi)始于文件開(kāi)頭,結(jié)束于文件結(jié)尾。全局變量和函數(shù)具有文件作用域,從定義件結(jié)尾。全局變量和函數(shù)具有文件作用域,從定義它們的位置開(kāi)始一直到本文件結(jié)束。全局變量和函它們的位置開(kāi)始一直到本文件結(jié)束。全局變量和函數(shù)如果在定義時(shí)使用了數(shù)如果在定義時(shí)使用了static存儲(chǔ)類關(guān)鍵字,它們的存儲(chǔ)類關(guān)鍵字,它們的作用域只限定在本文件以內(nèi);如果在定義時(shí)沒(méi)有使作用域只限定在本文件以內(nèi);如果在定義時(shí)沒(méi)有使用用static存儲(chǔ)類關(guān)鍵字,它們的作用域可以通過(guò)存儲(chǔ)類關(guān)鍵字,它們的作用域可以通過(guò)extern聲明語(yǔ)句擴(kuò)展到定義點(diǎn)之前及其他文件,使聲明語(yǔ)句擴(kuò)展到定義點(diǎn)之前及其他文件,使得它們?cè)诙x之前可以使用,以及其他

58、與定義所在得它們?cè)诙x之前可以使用,以及其他與定義所在文件不同的源文件中的函數(shù)也可以使用。關(guān)于文件不同的源文件中的函數(shù)也可以使用。關(guān)于static和和extern的詳細(xì)用法,見(jiàn)的詳細(xì)用法,見(jiàn)5.5節(jié)。節(jié)。6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組50(2)塊范圍。其作用域開(kāi)始于左大花括號(hào))塊范圍。其作用域開(kāi)始于左大花括號(hào)“”,結(jié)束,結(jié)束于右大花括號(hào)于右大花括號(hào)“”。在復(fù)合語(yǔ)句內(nèi)定義的變量其作。在復(fù)合語(yǔ)句內(nèi)定義的變量其作用域?qū)儆趬K范圍,就在定義該變量的塊內(nèi)。在函數(shù)用域?qū)儆趬K范圍,就在定義該變量的塊內(nèi)。在函數(shù)的開(kāi)始部分定義的變量和函數(shù)的形式參數(shù),其作用的開(kāi)始部分定義的變量和函數(shù)的形式參數(shù)

59、,其作用域也屬于塊范圍,就在定義該變量的函數(shù)內(nèi)部。在域也屬于塊范圍,就在定義該變量的函數(shù)內(nèi)部。在不同函數(shù)中的同名變量相互之間沒(méi)有任何關(guān)系。不同函數(shù)中的同名變量相互之間沒(méi)有任何關(guān)系。(3)函數(shù)原型范圍。在函數(shù)原型中說(shuō)明的變量只在函)函數(shù)原型范圍。在函數(shù)原型中說(shuō)明的變量只在函數(shù)原型內(nèi)有效,開(kāi)始于原型左括號(hào)數(shù)原型內(nèi)有效,開(kāi)始于原型左括號(hào)“(”,結(jié)束于,結(jié)束于原型右括號(hào)原型右括號(hào)“)”。(4)函數(shù)范圍。開(kāi)始于函數(shù)體的左大花括號(hào))函數(shù)范圍。開(kāi)始于函數(shù)體的左大花括號(hào)“”,結(jié),結(jié)束于函數(shù)體的右大花括號(hào)束于函數(shù)體的右大花括號(hào)“”。只有。只有g(shù)oto語(yǔ)句的標(biāo)語(yǔ)句的標(biāo)號(hào)屬于函數(shù)范圍,只能作用于同一函數(shù)內(nèi)。號(hào)屬于函

60、數(shù)范圍,只能作用于同一函數(shù)內(nèi)。6/15/2021華中科技大學(xué)計(jì)算機(jī)學(xué)院C語(yǔ)言課程組51區(qū)分外部變量的引用性聲明和定義性聲明區(qū)分外部變量的引用性聲明和定義性聲明 n外部變量的引用性聲明用于通報(bào)變量的性質(zhì)外部變量的引用性聲明用于通報(bào)變量的性質(zhì)(主要是變量的類型)(主要是變量的類型)n外部變量的定義性聲明除此以外還引起存儲(chǔ)分配。如果在函外部變量的定義性聲明除此以外還引起存儲(chǔ)分配。如果在函數(shù)外部有如下說(shuō)明語(yǔ)句:數(shù)外部有如下說(shuō)明語(yǔ)句: int sp;n這是外部變量的定義性聲明,一方面說(shuō)明了這是外部變量的定義性聲明,一方面說(shuō)明了sp的類型為的類型為int,另一方面系統(tǒng)還要為其分配另一方面系統(tǒng)還要為其分配2

溫馨提示

  • 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)論