




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第第6章章 函數(shù)與編譯預(yù)處理函數(shù)與編譯預(yù)處理6.1 C程序的模塊結(jié)構(gòu)程序的模塊結(jié)構(gòu)6.2 函數(shù)的定義與調(diào)用函數(shù)的定義與調(diào)用6.3 函數(shù)的參數(shù)傳遞函數(shù)的參數(shù)傳遞6.4 函數(shù)的嵌套調(diào)用與遞歸調(diào)用函數(shù)的嵌套調(diào)用與遞歸調(diào)用6.5 變量的作用域與存儲(chǔ)類別變量的作用域與存儲(chǔ)類別6.6 內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和外部函數(shù)6.7 函數(shù)應(yīng)用舉例函數(shù)應(yīng)用舉例6.8 編譯預(yù)處理編譯預(yù)處理本章小結(jié)本章小結(jié)6.1 C程序的模塊結(jié)構(gòu)程序的模塊結(jié)構(gòu)一個(gè)用一個(gè)用C語(yǔ)言開發(fā)的軟件往往由許多功能模塊組成,各語(yǔ)言開發(fā)的軟件往往由許多功能模塊組成,各個(gè)功能模塊彼此有一定的聯(lián)系,功能上各自獨(dú)立。在個(gè)功能模塊彼此有一定的聯(lián)系,功能上各
2、自獨(dú)立。在C語(yǔ)言中,用函數(shù)來(lái)實(shí)現(xiàn)功能模塊的定義。通常一個(gè)具語(yǔ)言中,用函數(shù)來(lái)實(shí)現(xiàn)功能模塊的定義。通常一個(gè)具有一定規(guī)模的有一定規(guī)模的C程序往往由多個(gè)函數(shù)組成。其中有且僅程序往往由多個(gè)函數(shù)組成。其中有且僅有一個(gè)主函數(shù),由主函數(shù)來(lái)調(diào)用其他函數(shù)。如圖有一個(gè)主函數(shù),由主函數(shù)來(lái)調(diào)用其他函數(shù)。如圖6-1所所示是一個(gè)程序中函數(shù)調(diào)用的示意圖。示是一個(gè)程序中函數(shù)調(diào)用的示意圖。 圖圖6-1 C語(yǔ)言程序的模塊語(yǔ)言程序的模塊結(jié)構(gòu)結(jié)構(gòu)C語(yǔ)言中,函數(shù)可按多種方式來(lái)分類:語(yǔ)言中,函數(shù)可按多種方式來(lái)分類:(1)從使用的角度來(lái)分,可以分為標(biāo)準(zhǔn)函數(shù)和用戶函數(shù)。)從使用的角度來(lái)分,可以分為標(biāo)準(zhǔn)函數(shù)和用戶函數(shù)。(2)從形式上來(lái)分,可以分
3、為無(wú)參函數(shù)和有參函數(shù)。)從形式上來(lái)分,可以分為無(wú)參函數(shù)和有參函數(shù)。(3)從作用范圍來(lái)分,可以分為外部函數(shù)和內(nèi)部函數(shù)。)從作用范圍來(lái)分,可以分為外部函數(shù)和內(nèi)部函數(shù)。(4)從返回值來(lái)分,可以分為無(wú)返回值函數(shù)和有返回值函)從返回值來(lái)分,可以分為無(wú)返回值函數(shù)和有返回值函數(shù)。數(shù)。6.2 函數(shù)的定義與調(diào)用函數(shù)的定義與調(diào)用6.2.1 函數(shù)的定義函數(shù)的定義C語(yǔ)言函數(shù)的定義包括對(duì)函數(shù)名、函數(shù)的參數(shù)、函數(shù)返回值語(yǔ)言函數(shù)的定義包括對(duì)函數(shù)名、函數(shù)的參數(shù)、函數(shù)返回值的類型與函數(shù)功能的描述。的類型與函數(shù)功能的描述。 一般形式為:一般形式為:類型符 函數(shù)名(形式參數(shù)說(shuō)明) 聲明與定義部分 語(yǔ)句部分1函數(shù)首部函數(shù)首部函數(shù)首部
4、用于對(duì)函數(shù)的特征進(jìn)行定義。類型符用于標(biāo)識(shí)函數(shù)函數(shù)首部用于對(duì)函數(shù)的特征進(jìn)行定義。類型符用于標(biāo)識(shí)函數(shù)返回值的類型。當(dāng)函數(shù)不返回值時(shí),習(xí)慣用返回值的類型。當(dāng)函數(shù)不返回值時(shí),習(xí)慣用VOID來(lái)標(biāo)記。來(lái)標(biāo)記。另外,當(dāng)函數(shù)返回另外,當(dāng)函數(shù)返回INT型值時(shí),類型符型值時(shí),類型符INT可以省略??梢允÷?。函數(shù)名是一個(gè)標(biāo)識(shí)符,在函數(shù)定義中,函數(shù)名后括號(hào)內(nèi)的形函數(shù)名是一個(gè)標(biāo)識(shí)符,在函數(shù)定義中,函數(shù)名后括號(hào)內(nèi)的形式參數(shù)(式參數(shù)(FORMAL PARAMETER)是按需要而設(shè)定的,也)是按需要而設(shè)定的,也可以沒有形式參數(shù),但函數(shù)名后一對(duì)圓括號(hào)必須保留。形式可以沒有形式參數(shù),但函數(shù)名后一對(duì)圓括號(hào)必須保留。形式參數(shù)簡(jiǎn)稱形參
5、。參數(shù)簡(jiǎn)稱形參。當(dāng)函數(shù)有形參時(shí),在形參表中,除給出形參名外,還要指出當(dāng)函數(shù)有形參時(shí),在形參表中,除給出形參名外,還要指出它的類型。一般形式為:它的類型。一般形式為:類型符 形參名1,類型符 形參名2,類型符 形參名N2函數(shù)體函數(shù)體在函數(shù)定義的最外層花括號(hào)括起來(lái)的部分稱作函數(shù)體。在函在函數(shù)定義的最外層花括號(hào)括起來(lái)的部分稱作函數(shù)體。在函數(shù)體的前面部分可以包含函數(shù)體中程序?qū)ο蟮穆暶骱妥兞慷〝?shù)體的前面部分可以包含函數(shù)體中程序?qū)ο蟮穆暶骱妥兞慷x,聲明和定義之后是描述函數(shù)功能的語(yǔ)句部分。義,聲明和定義之后是描述函數(shù)功能的語(yǔ)句部分。函數(shù)體中的函數(shù)體中的RETURN語(yǔ)句用于傳遞函數(shù)的返回值。一般格式語(yǔ)句用于
6、傳遞函數(shù)的返回值。一般格式為:為:RETURN 表達(dá)式;說(shuō)明:說(shuō)明:(1)一個(gè)函數(shù)中可以有多個(gè))一個(gè)函數(shù)中可以有多個(gè)RETURN語(yǔ)句,當(dāng)執(zhí)行到某個(gè)語(yǔ)句,當(dāng)執(zhí)行到某個(gè)RETURN語(yǔ)句時(shí),程序的控制流程返回調(diào)用函數(shù),并將語(yǔ)句時(shí),程序的控制流程返回調(diào)用函數(shù),并將RETURN語(yǔ)句中表達(dá)式的值作為函數(shù)值帶回。語(yǔ)句中表達(dá)式的值作為函數(shù)值帶回。(2)若函數(shù)體內(nèi)沒有)若函數(shù)體內(nèi)沒有RETURN語(yǔ)句,就一直執(zhí)行到函數(shù)體語(yǔ)句,就一直執(zhí)行到函數(shù)體的末尾,然后返回調(diào)用函數(shù)。這時(shí)也有一個(gè)不確定的函數(shù)值的末尾,然后返回調(diào)用函數(shù)。這時(shí)也有一個(gè)不確定的函數(shù)值被帶回。被帶回。(3)若不需要帶回函數(shù)值,一般將函數(shù)定義為)若不需要
7、帶回函數(shù)值,一般將函數(shù)定義為VOID類型。類型。(4)RETURN語(yǔ)句中表達(dá)式的類型應(yīng)與函數(shù)返回值的類型語(yǔ)句中表達(dá)式的類型應(yīng)與函數(shù)返回值的類型一致。不一致時(shí),以函數(shù)返回值的類型為準(zhǔn)。一致。不一致時(shí),以函數(shù)返回值的類型為準(zhǔn)。3空函數(shù)空函數(shù)C語(yǔ)言還允許函數(shù)體為空的函數(shù),其形式為:語(yǔ)言還允許函數(shù)體為空的函數(shù),其形式為:函數(shù)名() 調(diào)用此函數(shù)時(shí),什么工作也不做。調(diào)用此函數(shù)時(shí),什么工作也不做。6.2.2 函數(shù)的調(diào)用函數(shù)的調(diào)用函數(shù)調(diào)用的一般形式為:函數(shù)調(diào)用的一般形式為:函數(shù)名(實(shí)在參數(shù)表)當(dāng)有多個(gè)實(shí)在參數(shù)(當(dāng)有多個(gè)實(shí)在參數(shù)(ACTUAL PARAMETER)時(shí),實(shí)在參)時(shí),實(shí)在參數(shù)之間用逗號(hào)分隔。數(shù)之間用
8、逗號(hào)分隔。如果調(diào)用的是無(wú)參數(shù)函數(shù),則調(diào)用形式為:如果調(diào)用的是無(wú)參數(shù)函數(shù),則調(diào)用形式為:函數(shù)名()其中函數(shù)名之后的一對(duì)括號(hào)不能省略。其中函數(shù)名之后的一對(duì)括號(hào)不能省略。函數(shù)調(diào)用時(shí)提供的實(shí)在參數(shù)(簡(jiǎn)稱實(shí)參)應(yīng)與被調(diào)用函數(shù)的函數(shù)調(diào)用時(shí)提供的實(shí)在參數(shù)(簡(jiǎn)稱實(shí)參)應(yīng)與被調(diào)用函數(shù)的形式參數(shù)按順序一一對(duì)應(yīng),而且參數(shù)類型要一致。形式參數(shù)按順序一一對(duì)應(yīng),而且參數(shù)類型要一致。按調(diào)用函數(shù)在程序中的作用不同,有兩種不同的應(yīng)用方式:按調(diào)用函數(shù)在程序中的作用不同,有兩種不同的應(yīng)用方式:(1)將函數(shù)調(diào)用作為一個(gè)獨(dú)立的語(yǔ)句。如前面例子中經(jīng)常)將函數(shù)調(diào)用作為一個(gè)獨(dú)立的語(yǔ)句。如前面例子中經(jīng)常使用的輸入輸出函數(shù)調(diào)用。這種應(yīng)用情況不要
9、求或無(wú)視函數(shù)使用的輸入輸出函數(shù)調(diào)用。這種應(yīng)用情況不要求或無(wú)視函數(shù)的返回值,需要的只是函數(shù)完成的操作。的返回值,需要的只是函數(shù)完成的操作。(2)函數(shù)調(diào)用作為表達(dá)式中的一個(gè)運(yùn)算量。這種應(yīng)用情況)函數(shù)調(diào)用作為表達(dá)式中的一個(gè)運(yùn)算量。這種應(yīng)用情況要求函數(shù)調(diào)用能返回一個(gè)值,參與表達(dá)式的計(jì)算。要求函數(shù)調(diào)用能返回一個(gè)值,參與表達(dá)式的計(jì)算。【例例6.1】求五邊形面積,長(zhǎng)度求五邊形面積,長(zhǎng)度L1L7從鍵盤輸入。從鍵盤輸入。6.2.3 對(duì)被調(diào)用函數(shù)的聲明和函數(shù)原型對(duì)被調(diào)用函數(shù)的聲明和函數(shù)原型1函數(shù)的聲明函數(shù)的聲明一般被調(diào)用函數(shù)應(yīng)放在調(diào)用函數(shù)之前定義。若被調(diào)用函數(shù)的一般被調(diào)用函數(shù)應(yīng)放在調(diào)用函數(shù)之前定義。若被調(diào)用函數(shù)的
10、定義在調(diào)用函數(shù)之后出現(xiàn),就必須在調(diào)用函數(shù)中對(duì)被調(diào)用函定義在調(diào)用函數(shù)之后出現(xiàn),就必須在調(diào)用函數(shù)中對(duì)被調(diào)用函數(shù)加以聲明,函數(shù)聲明的一般形式為:數(shù)加以聲明,函數(shù)聲明的一般形式為:類型符 函數(shù)名(形參類型1 形參名1,形參類型2 形參名2,);這種形式的函數(shù)聲明只是對(duì)已定義的函數(shù)名及其返回值的類這種形式的函數(shù)聲明只是對(duì)已定義的函數(shù)名及其返回值的類型、參數(shù)個(gè)數(shù)及參數(shù)類型作聲明,以便讓編譯程序預(yù)先知道型、參數(shù)個(gè)數(shù)及參數(shù)類型作聲明,以便讓編譯程序預(yù)先知道該標(biāo)識(shí)符是函數(shù)和函數(shù)返回值的類型,為該函數(shù)的調(diào)用編譯該標(biāo)識(shí)符是函數(shù)和函數(shù)返回值的類型,為該函數(shù)的調(diào)用編譯出正確的目標(biāo)代碼。出正確的目標(biāo)代碼。注意:函數(shù)的聲明
11、和函數(shù)的定義形式上類似,但兩者有本注意:函數(shù)的聲明和函數(shù)的定義形式上類似,但兩者有本質(zhì)的不同。主要區(qū)別在以下幾方面。質(zhì)的不同。主要區(qū)別在以下幾方面。(1)函數(shù)的定義()函數(shù)的定義(DEFINITION)是編寫一段程序,除)是編寫一段程序,除上面內(nèi)容之外,應(yīng)有函數(shù)具體的功能語(yǔ)句,即函數(shù)體,而上面內(nèi)容之外,應(yīng)有函數(shù)具體的功能語(yǔ)句,即函數(shù)體,而函數(shù)的聲明(函數(shù)的聲明(DECLARATION)僅是對(duì)編譯系統(tǒng)的一個(gè))僅是對(duì)編譯系統(tǒng)的一個(gè)說(shuō)明,不含具體的執(zhí)行動(dòng)作。說(shuō)明,不含具體的執(zhí)行動(dòng)作。(2)在程序中,函數(shù)的定義只能有一次,而函數(shù)的聲明)在程序中,函數(shù)的定義只能有一次,而函數(shù)的聲明可以有多次,有多少個(gè)主
12、調(diào)函數(shù)要調(diào)用該被調(diào)函數(shù),就應(yīng)可以有多次,有多少個(gè)主調(diào)函數(shù)要調(diào)用該被調(diào)函數(shù),就應(yīng)在各個(gè)主調(diào)函數(shù)中各自進(jìn)行聲明。在各個(gè)主調(diào)函數(shù)中各自進(jìn)行聲明?!纠?.2】計(jì)算并輸出計(jì)算并輸出Y的值。的值。以下幾種情況下,可省略函數(shù)聲明:以下幾種情況下,可省略函數(shù)聲明:(1)如果被調(diào)用函數(shù)的定義出現(xiàn)在調(diào)用它之前,根據(jù))如果被調(diào)用函數(shù)的定義出現(xiàn)在調(diào)用它之前,根據(jù)C語(yǔ)言語(yǔ)言的定義隱含著聲明原則,可以不必對(duì)被調(diào)用函數(shù)作聲明。例的定義隱含著聲明原則,可以不必對(duì)被調(diào)用函數(shù)作聲明。例6.1即是這種情況。即是這種情況。(2)如被調(diào)用函數(shù)的返回值是整型或字符型,也可以不對(duì))如被調(diào)用函數(shù)的返回值是整型或字符型,也可以不對(duì)它作聲明。
13、因編譯系統(tǒng)發(fā)現(xiàn)程序調(diào)用一個(gè)還未被定義或聲明它作聲明。因編譯系統(tǒng)發(fā)現(xiàn)程序調(diào)用一個(gè)還未被定義或聲明的函數(shù)時(shí),就假定它的返回值是整型的,而字符型又是與整的函數(shù)時(shí),就假定它的返回值是整型的,而字符型又是與整型相通的。型相通的。 (3)如果被調(diào)用函數(shù)的聲明已出現(xiàn)在函數(shù)定義之前(特別)如果被調(diào)用函數(shù)的聲明已出現(xiàn)在函數(shù)定義之前(特別是在程序文件的開頭處),則位于該函數(shù)聲明之后定義的所是在程序文件的開頭處),則位于該函數(shù)聲明之后定義的所有函數(shù)都可調(diào)用該函數(shù),而不必另加聲明。有函數(shù)都可調(diào)用該函數(shù),而不必另加聲明。除以上除以上3種情況外,包括調(diào)用另一個(gè)源程序文件中定義的函種情況外,包括調(diào)用另一個(gè)源程序文件中定義的
14、函數(shù),都應(yīng)對(duì)被調(diào)用函數(shù)在調(diào)用它之前作聲明。數(shù),都應(yīng)對(duì)被調(diào)用函數(shù)在調(diào)用它之前作聲明。2函數(shù)原型的概念函數(shù)原型的概念在對(duì)被調(diào)函數(shù)的聲明時(shí),編譯系統(tǒng)需知道被調(diào)函數(shù)有幾個(gè)參在對(duì)被調(diào)函數(shù)的聲明時(shí),編譯系統(tǒng)需知道被調(diào)函數(shù)有幾個(gè)參數(shù),各自是什么類型,而參數(shù)的名字是無(wú)關(guān)緊要的,因此,數(shù),各自是什么類型,而參數(shù)的名字是無(wú)關(guān)緊要的,因此,對(duì)被調(diào)函數(shù)的聲明也稱為函數(shù)原型(對(duì)被調(diào)函數(shù)的聲明也稱為函數(shù)原型(PROTOTYPE),函數(shù)),函數(shù)原型也可以簡(jiǎn)化為:原型也可以簡(jiǎn)化為:類型符 函數(shù)名(形參類型1,形參類型2,)6.3 函數(shù)的參數(shù)傳遞函數(shù)的參數(shù)傳遞在在C語(yǔ)言中,實(shí)參向形參傳送數(shù)據(jù)的方式是語(yǔ)言中,實(shí)參向形參傳送數(shù)據(jù)的
15、方式是“值傳遞值傳遞”,即實(shí),即實(shí)參的值傳給形參,是一種單向傳遞方式,不能由形參傳回給參的值傳給形參,是一種單向傳遞方式,不能由形參傳回給實(shí)參。在函數(shù)執(zhí)行過(guò)程中,形參的值可能被改變,但這改變實(shí)參。在函數(shù)執(zhí)行過(guò)程中,形參的值可能被改變,但這改變對(duì)原來(lái)與它對(duì)應(yīng)的實(shí)參沒有影響。對(duì)原來(lái)與它對(duì)應(yīng)的實(shí)參沒有影響。值傳遞的優(yōu)點(diǎn)在于被調(diào)用的函數(shù)不可能改變主調(diào)函數(shù)中變量值傳遞的優(yōu)點(diǎn)在于被調(diào)用的函數(shù)不可能改變主調(diào)函數(shù)中變量的值,而只能改變它的局部的臨時(shí)副本。這樣就可以避免被的值,而只能改變它的局部的臨時(shí)副本。這樣就可以避免被調(diào)用函數(shù)的操作對(duì)調(diào)用函數(shù)中的變量可能產(chǎn)生的副作用。調(diào)用函數(shù)的操作對(duì)調(diào)用函數(shù)中的變量可能產(chǎn)生
16、的副作用。C語(yǔ)言中,在值傳遞方式下,既可以在函數(shù)之間傳遞語(yǔ)言中,在值傳遞方式下,既可以在函數(shù)之間傳遞“變量的變量的值值”,也可以在函數(shù)之間傳遞,也可以在函數(shù)之間傳遞“變量的地址變量的地址”。【例例6.3】分析形參和實(shí)參的結(jié)合過(guò)程。分析形參和實(shí)參的結(jié)合過(guò)程。6.4 函數(shù)的嵌套調(diào)用與遞歸調(diào)用函數(shù)的嵌套調(diào)用與遞歸調(diào)用6.4.1 函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用在在C語(yǔ)言的函數(shù)定義內(nèi)不能再定義別的函數(shù),但一個(gè)函數(shù)為語(yǔ)言的函數(shù)定義內(nèi)不能再定義別的函數(shù),但一個(gè)函數(shù)為實(shí)現(xiàn)它的功能,可以調(diào)用其他函數(shù)。實(shí)現(xiàn)它的功能,可以調(diào)用其他函數(shù)。圖圖6-4示意了函數(shù)嵌套調(diào)用關(guān)系,其中編號(hào)表示執(zhí)行控制變示意了函數(shù)嵌套調(diào)用關(guān)系,其
17、中編號(hào)表示執(zhí)行控制變化的順序?;捻樞颉?圖圖6-4 函數(shù)嵌套調(diào)用控制流程函數(shù)嵌套調(diào)用控制流程【例例6.4】用弦截法求方程用弦截法求方程F(X)=X3-5X2+16X-8=0的根。的根。6.4.2 函數(shù)的遞歸調(diào)用函數(shù)的遞歸調(diào)用1遞歸的基本概念遞歸的基本概念在一個(gè)程序中,若存在程序自己調(diào)用自己的現(xiàn)象就是構(gòu)成了在一個(gè)程序中,若存在程序自己調(diào)用自己的現(xiàn)象就是構(gòu)成了遞歸。遞歸。C語(yǔ)言允許函數(shù)的遞歸調(diào)用。在調(diào)用一個(gè)函數(shù)的過(guò)程語(yǔ)言允許函數(shù)的遞歸調(diào)用。在調(diào)用一個(gè)函數(shù)的過(guò)程中又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸調(diào)中又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸調(diào)用。如果函數(shù)用。如果函數(shù)A在執(zhí)行過(guò)
18、程中又調(diào)用函數(shù)在執(zhí)行過(guò)程中又調(diào)用函數(shù)A自己,則稱函數(shù)自己,則稱函數(shù)A為直接遞歸。如果函數(shù)為直接遞歸。如果函數(shù)A在執(zhí)行過(guò)程中先調(diào)用函數(shù)在執(zhí)行過(guò)程中先調(diào)用函數(shù)B,函數(shù),函數(shù)B在執(zhí)行過(guò)程中又調(diào)用函數(shù)在執(zhí)行過(guò)程中又調(diào)用函數(shù)A,則稱函數(shù),則稱函數(shù)A為間接遞歸。程序?yàn)殚g接遞歸。程序設(shè)計(jì)中常用的是直接遞歸。設(shè)計(jì)中常用的是直接遞歸。數(shù)學(xué)上遞歸定義的函數(shù)是非常多的。例如,當(dāng)數(shù)學(xué)上遞歸定義的函數(shù)是非常多的。例如,當(dāng)N為自然數(shù)時(shí),為自然數(shù)時(shí),求求N的階乘的階乘N!。2遞歸程序的執(zhí)行過(guò)程遞歸程序的執(zhí)行過(guò)程用一個(gè)簡(jiǎn)單的遞歸程序來(lái)分析遞歸程序的執(zhí)行過(guò)程。用一個(gè)簡(jiǎn)單的遞歸程序來(lái)分析遞歸程序的執(zhí)行過(guò)程?!纠?.5】求求N!
19、的遞歸函數(shù)。的遞歸函數(shù)。 圖圖6-6 FAC(3)的計(jì)算流程的計(jì)算流程3數(shù)值型遞歸問(wèn)題的求解方法數(shù)值型遞歸問(wèn)題的求解方法在掌握遞歸的基本概念和遞歸程序的執(zhí)行過(guò)程之后,還應(yīng)掌在掌握遞歸的基本概念和遞歸程序的執(zhí)行過(guò)程之后,還應(yīng)掌握編寫遞歸程序的基本方法。編寫遞歸程序要注意兩點(diǎn),一握編寫遞歸程序的基本方法。編寫遞歸程序要注意兩點(diǎn),一要找出正確的遞歸算法,這是編寫遞歸程序的基礎(chǔ);二要確要找出正確的遞歸算法,這是編寫遞歸程序的基礎(chǔ);二要確定算法的遞歸結(jié)束條件,這是決定遞歸程序能否正常結(jié)束的定算法的遞歸結(jié)束條件,這是決定遞歸程序能否正常結(jié)束的關(guān)鍵。關(guān)鍵。【例例6.6】用遞歸方法計(jì)算多項(xiàng)式函數(shù)的值。用遞歸方
20、法計(jì)算多項(xiàng)式函數(shù)的值。4非數(shù)值型遞歸問(wèn)題的求解方法非數(shù)值型遞歸問(wèn)題的求解方法對(duì)于非數(shù)值問(wèn)題,編寫遞歸程序的一般方法是:確定問(wèn)題的對(duì)于非數(shù)值問(wèn)題,編寫遞歸程序的一般方法是:確定問(wèn)題的最小模型并使用非遞歸算法解決,分解原來(lái)的非數(shù)值問(wèn)題建最小模型并使用非遞歸算法解決,分解原來(lái)的非數(shù)值問(wèn)題建立遞歸模型,確定遞歸模型的終止條件,將遞歸模型轉(zhuǎn)換為立遞歸模型,確定遞歸模型的終止條件,將遞歸模型轉(zhuǎn)換為遞歸程序。遞歸程序。尋找非數(shù)值問(wèn)題的遞歸算法可從分析問(wèn)題本身的規(guī)律入手,尋找非數(shù)值問(wèn)題的遞歸算法可從分析問(wèn)題本身的規(guī)律入手,按照下列步驟進(jìn)行分析:按照下列步驟進(jìn)行分析:(1)從化簡(jiǎn)問(wèn)題開始。將問(wèn)題進(jìn)行簡(jiǎn)化,將問(wèn)題
21、的規(guī)模縮)從化簡(jiǎn)問(wèn)題開始。將問(wèn)題進(jìn)行簡(jiǎn)化,將問(wèn)題的規(guī)模縮到最小,分析問(wèn)題在最簡(jiǎn)單情況下的求解方法。此時(shí)找到的到最小,分析問(wèn)題在最簡(jiǎn)單情況下的求解方法。此時(shí)找到的求解方法應(yīng)當(dāng)十分簡(jiǎn)單。求解方法應(yīng)當(dāng)十分簡(jiǎn)單。(2)對(duì)于一個(gè)一般的問(wèn)題,可將一個(gè)大問(wèn)題分解為兩個(gè))對(duì)于一個(gè)一般的問(wèn)題,可將一個(gè)大問(wèn)題分解為兩個(gè)(或若干個(gè))小問(wèn)題,使原來(lái)的大問(wèn)題變成這兩個(gè)(或若干(或若干個(gè))小問(wèn)題,使原來(lái)的大問(wèn)題變成這兩個(gè)(或若干個(gè))小問(wèn)題的組合,其中至少有一個(gè)小問(wèn)題與原來(lái)的問(wèn)題有個(gè))小問(wèn)題的組合,其中至少有一個(gè)小問(wèn)題與原來(lái)的問(wèn)題有相同的性質(zhì),只是在問(wèn)題的規(guī)模上與原來(lái)的問(wèn)題相比較有所相同的性質(zhì),只是在問(wèn)題的規(guī)模上與原來(lái)的問(wèn)
22、題相比較有所縮小??s小。(3)將分解后的每個(gè)小問(wèn)題作為一個(gè)整體,描述用這)將分解后的每個(gè)小問(wèn)題作為一個(gè)整體,描述用這些較小的問(wèn)題來(lái)解決原來(lái)大問(wèn)題的算法。些較小的問(wèn)題來(lái)解決原來(lái)大問(wèn)題的算法。由第(由第(3)步得到的算法就是一個(gè)解決原來(lái)問(wèn)題的遞歸)步得到的算法就是一個(gè)解決原來(lái)問(wèn)題的遞歸算法。由第(算法。由第(1)步將問(wèn)題的規(guī)??s到最小時(shí)的條件就)步將問(wèn)題的規(guī)??s到最小時(shí)的條件就是該遞歸算法的遞歸結(jié)束條件。是該遞歸算法的遞歸結(jié)束條件?!纠?.7】利用遞歸函數(shù)打印如圖利用遞歸函數(shù)打印如圖6-7所示的數(shù)字金字塔所示的數(shù)字金字塔圖形。圖形。圖圖6-7 數(shù)字金字塔數(shù)字金字塔5關(guān)于遞歸的幾點(diǎn)說(shuō)明關(guān)于遞歸的幾
23、點(diǎn)說(shuō)明當(dāng)一個(gè)問(wèn)題蘊(yùn)含了遞歸關(guān)系且結(jié)構(gòu)比較復(fù)雜時(shí),采用遞歸調(diào)當(dāng)一個(gè)問(wèn)題蘊(yùn)含了遞歸關(guān)系且結(jié)構(gòu)比較復(fù)雜時(shí),采用遞歸調(diào)用的程序設(shè)計(jì)技巧可以使程序變得簡(jiǎn)潔,增加了程序的可讀用的程序設(shè)計(jì)技巧可以使程序變得簡(jiǎn)潔,增加了程序的可讀性。但遞歸調(diào)用本身是以犧牲存儲(chǔ)空間為基礎(chǔ)的,因?yàn)槊恳恍?。但遞歸調(diào)用本身是以犧牲存儲(chǔ)空間為基礎(chǔ)的,因?yàn)槊恳淮芜f歸調(diào)用都要保存相關(guān)的參數(shù)和變量。同樣,遞歸本身也次遞歸調(diào)用都要保存相關(guān)的參數(shù)和變量。同樣,遞歸本身也不會(huì)加快執(zhí)行速度;相反,由于反復(fù)調(diào)用函數(shù),還會(huì)或多或不會(huì)加快執(zhí)行速度;相反,由于反復(fù)調(diào)用函數(shù),還會(huì)或多或少地增加時(shí)間開銷。遞歸調(diào)用能使代碼緊湊,并能夠很容易少地增加時(shí)間開銷。遞歸
24、調(diào)用能使代碼緊湊,并能夠很容易地解決一些用非遞歸算法很難解決的問(wèn)題。地解決一些用非遞歸算法很難解決的問(wèn)題。注意:所有的遞歸問(wèn)題都一定可以用非遞歸的算法實(shí)現(xiàn),并注意:所有的遞歸問(wèn)題都一定可以用非遞歸的算法實(shí)現(xiàn),并且已經(jīng)有了固定的算法。如何將遞歸程序轉(zhuǎn)化為非遞歸程序且已經(jīng)有了固定的算法。如何將遞歸程序轉(zhuǎn)化為非遞歸程序的算法已經(jīng)超出了本書的范圍,感興趣的讀者可以參看有關(guān)的算法已經(jīng)超出了本書的范圍,感興趣的讀者可以參看有關(guān)數(shù)據(jù)結(jié)構(gòu)的文獻(xiàn)資料。數(shù)據(jù)結(jié)構(gòu)的文獻(xiàn)資料。6.5 變量的作用域與存儲(chǔ)類別變量的作用域與存儲(chǔ)類別6.5.1 變量的作用域變量的作用域在程序中能對(duì)變量進(jìn)行存取操作的范圍稱為變量的作用域。在
25、程序中能對(duì)變量進(jìn)行存取操作的范圍稱為變量的作用域。根據(jù)變量的作用域不同,變量分為局部變量和全局變量。根據(jù)變量的作用域不同,變量分為局部變量和全局變量。1局部變量局部變量在一個(gè)函數(shù)體內(nèi)或復(fù)合語(yǔ)句內(nèi)定義的變量稱為局部變量。局在一個(gè)函數(shù)體內(nèi)或復(fù)合語(yǔ)句內(nèi)定義的變量稱為局部變量。局部變量只在定義它的函數(shù)體或復(fù)合語(yǔ)句內(nèi)有效,即只能在定部變量只在定義它的函數(shù)體或復(fù)合語(yǔ)句內(nèi)有效,即只能在定義它的函數(shù)體或復(fù)合語(yǔ)句內(nèi)部使用它,而在定義它的函數(shù)體義它的函數(shù)體或復(fù)合語(yǔ)句內(nèi)部使用它,而在定義它的函數(shù)體或復(fù)合語(yǔ)句之外不能使用它?;驈?fù)合語(yǔ)句之外不能使用它。2全局變量全局變量在函數(shù)定義之外定義的變量稱為全局變量。全局變量可以
26、在在函數(shù)定義之外定義的變量稱為全局變量。全局變量可以在定義它的文件中使用,其作用域是從它的定義處開始到變量定義它的文件中使用,其作用域是從它的定義處開始到變量所在文件的末尾。所在文件的末尾。說(shuō)明:說(shuō)明:(1)全局變量在程序執(zhí)行期間一直存在,一個(gè)全局變量也)全局變量在程序執(zhí)行期間一直存在,一個(gè)全局變量也可被位于它定義之前的函數(shù)使用,甚至別的源程序文件中的可被位于它定義之前的函數(shù)使用,甚至別的源程序文件中的函數(shù)使用,但需在使用之前給出外部變量的聲明(用關(guān)鍵字函數(shù)使用,但需在使用之前給出外部變量的聲明(用關(guān)鍵字EXTERN)。)。【例例6.8】寫出以下程序輸出結(jié)果。寫出以下程序輸出結(jié)果。(2)在同一
27、源文件中,如果全部變量與局部變量同名,則)在同一源文件中,如果全部變量與局部變量同名,則在局部變量的作用范圍內(nèi),全局變量不起作用。在局部變量的作用范圍內(nèi),全局變量不起作用?!纠?.9】寫出程序的輸出結(jié)果。寫出程序的輸出結(jié)果。(3)在程序中定義全局變量的主要目的是為函數(shù)間的數(shù)據(jù))在程序中定義全局變量的主要目的是為函數(shù)間的數(shù)據(jù)聯(lián)系提供一個(gè)直接傳遞的通道。在某些應(yīng)用中,函數(shù)將執(zhí)行聯(lián)系提供一個(gè)直接傳遞的通道。在某些應(yīng)用中,函數(shù)將執(zhí)行結(jié)果保留在全局變量中,使函數(shù)能返回多個(gè)值。在另一些應(yīng)結(jié)果保留在全局變量中,使函數(shù)能返回多個(gè)值。在另一些應(yīng)用中,將部分參數(shù)信息放在全局變量中,以減少函數(shù)調(diào)用時(shí)用中,將部分參
28、數(shù)信息放在全局變量中,以減少函數(shù)調(diào)用時(shí)的參數(shù)傳遞。因程序中的多個(gè)函數(shù)能使用全局變量,其中某的參數(shù)傳遞。因程序中的多個(gè)函數(shù)能使用全局變量,其中某個(gè)函數(shù)改變?nèi)肿兞康闹稻涂赡軙?huì)影響其他函數(shù)的執(zhí)行,產(chǎn)個(gè)函數(shù)改變?nèi)肿兞康闹稻涂赡軙?huì)影響其他函數(shù)的執(zhí)行,產(chǎn)生副作用。生副作用。6.5.2 變量的存儲(chǔ)類別變量的存儲(chǔ)類別變量具有可訪問(wèn)性和存在性兩種基本屬性。前面介紹的變量變量具有可訪問(wèn)性和存在性兩種基本屬性。前面介紹的變量作用域是指在程序的某個(gè)范圍內(nèi)的所有語(yǔ)句都可以通過(guò)變量作用域是指在程序的某個(gè)范圍內(nèi)的所有語(yǔ)句都可以通過(guò)變量名訪問(wèn)該變量,即代表變量的可訪問(wèn)性。名訪問(wèn)該變量,即代表變量的可訪問(wèn)性。在計(jì)算機(jī)中,保
29、存變量當(dāng)前值的存儲(chǔ)單元有兩類:一類是內(nèi)在計(jì)算機(jī)中,保存變量當(dāng)前值的存儲(chǔ)單元有兩類:一類是內(nèi)存,另一類是存,另一類是CPU中的寄存器。變量的存儲(chǔ)類別就是討論變中的寄存器。變量的存儲(chǔ)類別就是討論變量的存儲(chǔ)位置,量的存儲(chǔ)位置,C語(yǔ)言中定義了語(yǔ)言中定義了4種存儲(chǔ)類別,即自動(dòng)種存儲(chǔ)類別,即自動(dòng)(AUTO)變量、外部()變量、外部(EXTERN)變量、靜態(tài)()變量、靜態(tài)(STATIC)變量和寄存器(變量和寄存器(REGISTER)變量,它關(guān)系到變量在內(nèi)存中)變量,它關(guān)系到變量在內(nèi)存中的存放位置。的存放位置。C語(yǔ)言用變量的存儲(chǔ)類別指明變量的存在性,語(yǔ)言用變量的存儲(chǔ)類別指明變量的存在性,可分為兩大類:靜態(tài)存儲(chǔ)
30、和動(dòng)態(tài)存儲(chǔ)。所謂靜態(tài)存儲(chǔ)是指在可分為兩大類:靜態(tài)存儲(chǔ)和動(dòng)態(tài)存儲(chǔ)。所謂靜態(tài)存儲(chǔ)是指在程序運(yùn)行期間分配固定的存儲(chǔ)空間,而動(dòng)態(tài)存儲(chǔ)則是在程序程序運(yùn)行期間分配固定的存儲(chǔ)空間,而動(dòng)態(tài)存儲(chǔ)則是在程序運(yùn)行期間根據(jù)需要?jiǎng)討B(tài)分配存儲(chǔ)空間。運(yùn)行期間根據(jù)需要?jiǎng)討B(tài)分配存儲(chǔ)空間。變量的可訪問(wèn)性與存在性在某些場(chǎng)合是一致的,但在有些場(chǎng)變量的可訪問(wèn)性與存在性在某些場(chǎng)合是一致的,但在有些場(chǎng)合則不一致。存在這樣的情況,一個(gè)變量在某時(shí)刻雖然存在,合則不一致。存在這樣的情況,一個(gè)變量在某時(shí)刻雖然存在,但此時(shí)不可訪問(wèn)它。但此時(shí)不可訪問(wèn)它。1局部變量的存儲(chǔ)類別局部變量的存儲(chǔ)類別(1)自動(dòng)變量。)自動(dòng)變量。(2)局部靜態(tài)變量。)局部靜態(tài)變
31、量。【例例6.10】寫出程序的輸出結(jié)果。寫出程序的輸出結(jié)果。(3)寄存器變量。)寄存器變量。另有兩點(diǎn)需特別指出,其一是寄存器變量不能執(zhí)行取地址運(yùn)另有兩點(diǎn)需特別指出,其一是寄存器變量不能執(zhí)行取地址運(yùn)算(用運(yùn)算符算(用運(yùn)算符&);其二是寄存器變量不能是靜態(tài)變量。);其二是寄存器變量不能是靜態(tài)變量。2全局變量的存儲(chǔ)類別全局變量的存儲(chǔ)類別全局變量是在函數(shù)之外定義的變量,編譯時(shí)按靜態(tài)方式分配全局變量是在函數(shù)之外定義的變量,編譯時(shí)按靜態(tài)方式分配存儲(chǔ)單元。全局變量可以為程序中各個(gè)函數(shù)所引用。存儲(chǔ)單元。全局變量可以為程序中各個(gè)函數(shù)所引用。一個(gè)一個(gè)C程序可以由一個(gè)或多個(gè)源程序文件組成,而全局變量程序可以
32、由一個(gè)或多個(gè)源程序文件組成,而全局變量定義的作用域是從它的定義處開始到源程序文件的末尾。如定義的作用域是從它的定義處開始到源程序文件的末尾。如果在位于全局變量定義之前的函數(shù)中要引用該全局變量,需果在位于全局變量定義之前的函數(shù)中要引用該全局變量,需在引用之前對(duì)它作外部變量聲明。同樣地,如果在定義全局在引用之前對(duì)它作外部變量聲明。同樣地,如果在定義全局變量源文件之外的源文件中引用該全局變量,也需在引用之變量源文件之外的源文件中引用該全局變量,也需在引用之前對(duì)它作外部變量聲明。在變量定義之前冠以關(guān)鍵字前對(duì)它作外部變量聲明。在變量定義之前冠以關(guān)鍵字EXTERN,就聲明變量是外部變量。,就聲明變量是外部
33、變量。為了表明變量是靜態(tài)的,在變量定義時(shí)冠以關(guān)鍵字為了表明變量是靜態(tài)的,在變量定義時(shí)冠以關(guān)鍵字STATIC。在在C語(yǔ)言中,語(yǔ)言中,“靜態(tài)靜態(tài)”包含兩方面的意義。從程序?qū)ο笤诔绦虬瑑煞矫娴囊饬x。從程序?qū)ο笤诔绦驁?zhí)行期間的存在性來(lái)看,靜態(tài)表示該程序?qū)ο髨?zhí)行期間的存在性來(lái)看,靜態(tài)表示該程序?qū)ο蟆坝谰糜谰谩贝嬖?。存在。從程序?qū)ο罂稍L問(wèn)或可調(diào)用來(lái)看,靜態(tài)表示該程序?qū)ο蟮膶某绦驅(qū)ο罂稍L問(wèn)或可調(diào)用來(lái)看,靜態(tài)表示該程序?qū)ο蟮膶S锰匦浴>唧w表現(xiàn)在,局部靜態(tài)變量只有定義它的函數(shù)可訪用特性。具體表現(xiàn)在,局部靜態(tài)變量只有定義它的函數(shù)可訪問(wèn),全局靜態(tài)變量只有在定義它的源文件中可訪問(wèn)或可調(diào)用。問(wèn),全局靜態(tài)變量只有在定
34、義它的源文件中可訪問(wèn)或可調(diào)用。6.6 內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和外部函數(shù)6.6.1 內(nèi)部函數(shù)內(nèi)部函數(shù)內(nèi)部函數(shù)又被稱為靜態(tài)函數(shù),它只能被定義它的文件中的其內(nèi)部函數(shù)又被稱為靜態(tài)函數(shù),它只能被定義它的文件中的其他函數(shù)調(diào)用,而不能被其他文件中的函數(shù)調(diào)用,亦即內(nèi)部函他函數(shù)調(diào)用,而不能被其他文件中的函數(shù)調(diào)用,亦即內(nèi)部函數(shù)的作用范圍僅僅局限于本文件。為了定義內(nèi)部函數(shù),需要數(shù)的作用范圍僅僅局限于本文件。為了定義內(nèi)部函數(shù),需要使用關(guān)鍵字使用關(guān)鍵字STATIC。例如。例如:STATIC LONG FACTORIAL(INT X);此時(shí),函數(shù)此時(shí),函數(shù)FACTORIAL的作用范圍僅局限于定義它的文件,的作用范圍僅
35、局限于定義它的文件,而在其他源文件中不能調(diào)用此函數(shù)。如果在不同的源文件中而在其他源文件中不能調(diào)用此函數(shù)。如果在不同的源文件中存在同名的內(nèi)部函數(shù),它們互不干擾。存在同名的內(nèi)部函數(shù),它們互不干擾。6.6.2 外部函數(shù)外部函數(shù)因?yàn)楹瘮?shù)與函數(shù)之間都是并列的,即函數(shù)不能嵌套定義,所因?yàn)楹瘮?shù)與函數(shù)之間都是并列的,即函數(shù)不能嵌套定義,所以函數(shù)在本質(zhì)上都具有外部性質(zhì)。內(nèi)部函數(shù)(靜態(tài)函數(shù))只以函數(shù)在本質(zhì)上都具有外部性質(zhì)。內(nèi)部函數(shù)(靜態(tài)函數(shù))只能被定義它的源文件中的函數(shù)調(diào)用,而不能被其他源文件中能被定義它的源文件中的函數(shù)調(diào)用,而不能被其他源文件中的函數(shù)調(diào)用。除此之外,其余的函數(shù)既可被定義它的源文件的函數(shù)調(diào)用。除此
36、之外,其余的函數(shù)既可被定義它的源文件中的函數(shù)調(diào)用,也可以被其他源文件中的函數(shù)所調(diào)用,即其中的函數(shù)調(diào)用,也可以被其他源文件中的函數(shù)所調(diào)用,即其作用范圍不只局限于函數(shù)所在的源文件,而是整個(gè)程序的所作用范圍不只局限于函數(shù)所在的源文件,而是整個(gè)程序的所有文件。有時(shí)為了明確這種性質(zhì),可以在函數(shù)定義和調(diào)用時(shí)有文件。有時(shí)為了明確這種性質(zhì),可以在函數(shù)定義和調(diào)用時(shí)使用關(guān)鍵字使用關(guān)鍵字EXTERN,EXTERN既可用于外部函數(shù)的定義,既可用于外部函數(shù)的定義,也可用于外部函數(shù)的聲明。也可用于外部函數(shù)的聲明。6.7 函數(shù)應(yīng)用舉例函數(shù)應(yīng)用舉例【例例6.11】先定義函數(shù)求,然后調(diào)用該函數(shù)求。先定義函數(shù)求,然后調(diào)用該函數(shù)求
37、?!纠?.12】設(shè)計(jì)一個(gè)按分?jǐn)?shù)規(guī)則進(jìn)行加減法的程序。其中設(shè)計(jì)一個(gè)按分?jǐn)?shù)規(guī)則進(jìn)行加減法的程序。其中I=KMNL,J=LM,I、J的最大公約數(shù)為的最大公約數(shù)為1?!纠?.13】設(shè)計(jì)一個(gè)程序,求同時(shí)滿足下列兩個(gè)條件的分?jǐn)?shù)設(shè)計(jì)一個(gè)程序,求同時(shí)滿足下列兩個(gè)條件的分?jǐn)?shù)X的個(gè)數(shù):的個(gè)數(shù):(1)1/6X1/5。(2)X的分子分母都是素?cái)?shù)且分母是的分子分母都是素?cái)?shù)且分母是2位數(shù)。位數(shù)?!纠?.14】漢諾(漢諾(HANOI)塔問(wèn)題。有)塔問(wèn)題。有3根柱子根柱子A、B、C,A上堆放了上堆放了N個(gè)盤子,盤子大小不等,大的在下,小的在上,個(gè)盤子,盤子大小不等,大的在下,小的在上,如圖如圖6-8所示?,F(xiàn)在要求把這所
38、示?,F(xiàn)在要求把這N個(gè)盤子從個(gè)盤子從A搬到搬到C,在搬動(dòng)過(guò),在搬動(dòng)過(guò)程中可以借助程中可以借助B作為中轉(zhuǎn),每次只允許搬動(dòng)一個(gè)盤子,且在作為中轉(zhuǎn),每次只允許搬動(dòng)一個(gè)盤子,且在移動(dòng)過(guò)程中在移動(dòng)過(guò)程中在3根柱子上都保持大盤在下,小盤在上。要求根柱子上都保持大盤在下,小盤在上。要求打印出移動(dòng)的步驟。打印出移動(dòng)的步驟。 A B C 圖圖6-8 漢諾塔問(wèn)題漢諾塔問(wèn)題6.8 編譯預(yù)處理編譯預(yù)處理C語(yǔ)言共有語(yǔ)言共有3種編譯預(yù)處理命令,即宏定義、文件包含種編譯預(yù)處理命令,即宏定義、文件包含和條件編譯。和條件編譯。6.8.1 宏定義宏定義C語(yǔ)言有兩種宏定義命令:帶參數(shù)的宏定義和不帶參數(shù)語(yǔ)言有兩種宏定義命令:帶參數(shù)的宏
39、定義和不帶參數(shù)的宏定義。的宏定義。 不帶參數(shù)的宏定義格式比較簡(jiǎn)單,通常不帶參數(shù)的宏定義格式比較簡(jiǎn)單,通常用來(lái)定義符號(hào)常量,其格式為:用來(lái)定義符號(hào)常量,其格式為:#DEFINE 宏名 字符序列其中宏名是一個(gè)標(biāo)識(shí)符。其中宏名是一個(gè)標(biāo)識(shí)符。為了和變量有所區(qū)別,習(xí)慣上定義符號(hào)常量時(shí)只使用為了和變量有所區(qū)別,習(xí)慣上定義符號(hào)常量時(shí)只使用大寫字母,但并不是非大寫不可。大寫字母,但并不是非大寫不可。使用符號(hào)常量有兩點(diǎn)好處:一是程序可讀性好,易于使用符號(hào)常量有兩點(diǎn)好處:一是程序可讀性好,易于閱讀理解;二是有利于程序的調(diào)試和修改。閱讀理解;二是有利于程序的調(diào)試和修改。在定義宏時(shí)還可以加上參數(shù),這就構(gòu)成了帶參數(shù)的宏
40、:在定義宏時(shí)還可以加上參數(shù),這就構(gòu)成了帶參數(shù)的宏:#DEFINE 宏名(參數(shù)表) 帶有參數(shù)的字符序列帶參數(shù)的宏和函數(shù)之間有以下的區(qū)別:帶參數(shù)的宏和函數(shù)之間有以下的區(qū)別:(1)函數(shù)調(diào)用時(shí)先求實(shí)參表達(dá)式的值,再傳給形參。而帶)函數(shù)調(diào)用時(shí)先求實(shí)參表達(dá)式的值,再傳給形參。而帶參數(shù)的宏只是簡(jiǎn)單的字符替換,宏展開時(shí)并不對(duì)實(shí)參表達(dá)式參數(shù)的宏只是簡(jiǎn)單的字符替換,宏展開時(shí)并不對(duì)實(shí)參表達(dá)式求值。函數(shù)調(diào)用時(shí)臨時(shí)分配存儲(chǔ)單元,宏替換并不分配存儲(chǔ)求值。函數(shù)調(diào)用時(shí)臨時(shí)分配存儲(chǔ)單元,宏替換并不分配存儲(chǔ)單元,也沒有返回值。單元,也沒有返回值。(2)宏比函數(shù)快。宏替換只占編譯時(shí)間,不占運(yùn)行時(shí)間。)宏比函數(shù)快。宏替換只占編譯時(shí)間
41、,不占運(yùn)行時(shí)間。但函數(shù)調(diào)用時(shí)分配存儲(chǔ)單元、傳值、返回值時(shí)都占時(shí)間。但函數(shù)調(diào)用時(shí)分配存儲(chǔ)單元、傳值、返回值時(shí)都占時(shí)間。(3)使用宏的程序代碼較長(zhǎng),因?yàn)楹暝诔绦蛑写嬖诹硕啻?,)使用宏的程序代碼較長(zhǎng),因?yàn)楹暝诔绦蛑写嬖诹硕啻?,而使用函?shù)時(shí),雖然多次調(diào)用,但函數(shù)代碼只存在一次。而使用函數(shù)時(shí),雖然多次調(diào)用,但函數(shù)代碼只存在一次。(4)宏調(diào)用與宏定義之間可以不考慮參數(shù)的類型,而函數(shù))宏調(diào)用與宏定義之間可以不考慮參數(shù)的類型,而函數(shù)調(diào)用對(duì)實(shí)參有類型要求。調(diào)用對(duì)實(shí)參有類型要求。(5)一般情況下,調(diào)用函數(shù)只能得到一個(gè)返回值,而用宏)一般情況下,調(diào)用函數(shù)只能得到一個(gè)返回值,而用宏可以設(shè)法得到幾個(gè)結(jié)果??梢栽O(shè)法得到幾
42、個(gè)結(jié)果。6.8.2 文件包含文件包含所謂文件包含是指將另一個(gè)源程序文件嵌入到正在進(jìn)所謂文件包含是指將另一個(gè)源程序文件嵌入到正在進(jìn)行編譯預(yù)處理的源程序中的相應(yīng)位置上。文件包含命行編譯預(yù)處理的源程序中的相應(yīng)位置上。文件包含命令的格式為:令的格式為:#INCLUDE 或者:或者:#INCLUDE “文件名”其中文件名是指被嵌入的源程序文件的文件名,必須其中文件名是指被嵌入的源程序文件的文件名,必須用雙引號(hào)或者尖括號(hào)括起來(lái)。用雙引號(hào)或者尖括號(hào)括起來(lái)。【例例6.15】設(shè)有文件設(shè)有文件FORMAT.H:#DEFINE PR PRINTF#DEFINE NL “N”#DEFINE F “%6.3F”#DEF
43、INE F1 F NL#DEFINE F2 F F NL#DEFINE F3 F F F NL寫出下列程序的執(zhí)行結(jié)果。寫出下列程序的執(zhí)行結(jié)果。6.8.3 條件編譯條件編譯條件編譯是指根據(jù)條件對(duì)條件編譯是指根據(jù)條件對(duì)C程序的部分語(yǔ)句進(jìn)行編譯,程序的部分語(yǔ)句進(jìn)行編譯,其他語(yǔ)句不編譯。條件編譯命令有其他語(yǔ)句不編譯。條件編譯命令有3種形式。種形式。形式形式1:#IFDEF 標(biāo)識(shí)符 程序段1 #ELSE 程序段2#ENDIF其作用是當(dāng)標(biāo)識(shí)符已被定義(常用宏定義),則對(duì)程其作用是當(dāng)標(biāo)識(shí)符已被定義(常用宏定義),則對(duì)程序段序段1進(jìn)行編譯,否則對(duì)程序段進(jìn)行編譯,否則對(duì)程序段2進(jìn)行編譯。其中如果進(jìn)行編譯。其中如
44、果程序段程序段2為空,為空,#ELSE部分可以省略。部分可以省略。這里的程序段可以是任何這里的程序段可以是任何C代碼行,也可以包含預(yù)處理命令代碼行,也可以包含預(yù)處理命令行。其中的標(biāo)識(shí)符只要求已定義與否,與標(biāo)識(shí)符被定義成什行。其中的標(biāo)識(shí)符只要求已定義與否,與標(biāo)識(shí)符被定義成什么無(wú)關(guān)。如標(biāo)識(shí)符只用于這個(gè)目的,常用以下形式的宏定義么無(wú)關(guān)。如標(biāo)識(shí)符只用于這個(gè)目的,常用以下形式的宏定義來(lái)定義這類標(biāo)識(shí)符:來(lái)定義這類標(biāo)識(shí)符:#DEFINE 標(biāo)識(shí)符即標(biāo)識(shí)符之后為空,直接以換行結(jié)束該宏定義命令。即標(biāo)識(shí)符之后為空,直接以換行結(jié)束該宏定義命令。形式形式2:#IFNDEF 標(biāo)識(shí)符 程序段1#ELSE 程序段2 #END
45、IF與形式與形式1的條件編譯命令的唯一差異是第一行的的條件編譯命令的唯一差異是第一行的IFDEF改為改為IFNDEF。其作用是當(dāng)標(biāo)識(shí)符未被定義時(shí),編譯程序段。其作用是當(dāng)標(biāo)識(shí)符未被定義時(shí),編譯程序段1,否,否則編譯程序段則編譯程序段2。形式形式3:#IF 表達(dá)式 程序段1 #ELSE 程序段2#ENDIF其中表達(dá)式為常量表達(dá)式,其作用是當(dāng)指定的表達(dá)式值為非其中表達(dá)式為常量表達(dá)式,其作用是當(dāng)指定的表達(dá)式值為非零時(shí),編譯程序段零時(shí),編譯程序段1,否則編譯程序段,否則編譯程序段2。條件編譯預(yù)處理命令可以嵌套。特別是為了便于描述條件編譯預(yù)處理命令可以嵌套。特別是為了便于描述#ELSE后的程序段又是條件編
46、譯情況,引入預(yù)處理命后的程序段又是條件編譯情況,引入預(yù)處理命令符令符#ELIF。它的意思就是。它的意思就是#ELSE #IF。所以條件編譯。所以條件編譯預(yù)處命令更一般的形式為:預(yù)處命令更一般的形式為:#IF 表達(dá)式1 程序段1#ELIF 表達(dá)式2 程序段2 #ELIF 表達(dá)式N 程序段N#ELSE 程序段N+1#ENDIF前面的條件編譯命令形式前面的條件編譯命令形式1和形式和形式2也有類似的形式。也有類似的形式。本本 章章 小小 結(jié)結(jié)1函數(shù)是利用函數(shù)是利用C語(yǔ)言進(jìn)行結(jié)構(gòu)化程序設(shè)計(jì)的最基本的概念,語(yǔ)言進(jìn)行結(jié)構(gòu)化程序設(shè)計(jì)的最基本的概念,C程序是由函數(shù)組成的。可以把一個(gè)復(fù)雜的程序分成多個(gè)模程序是由函
47、數(shù)組成的??梢园岩粋€(gè)復(fù)雜的程序分成多個(gè)模塊進(jìn)行設(shè)計(jì),而每個(gè)模塊是一個(gè)函數(shù)。塊進(jìn)行設(shè)計(jì),而每個(gè)模塊是一個(gè)函數(shù)。MAIN()是是C程序中最程序中最重要的函數(shù),程序運(yùn)行從函數(shù)重要的函數(shù),程序運(yùn)行從函數(shù)MAIN()開始,也在函數(shù)開始,也在函數(shù)MAIN()結(jié)束。在函數(shù)結(jié)束。在函數(shù)MAIN()的執(zhí)行過(guò)程中,可以調(diào)用其他的執(zhí)行過(guò)程中,可以調(diào)用其他函數(shù)。函數(shù)。2函數(shù)定義的一般形式為:函數(shù)定義的一般形式為:類型符 函數(shù)名(形式參數(shù)說(shuō)明) 聲明與定義部分 語(yǔ)句部分類型符指明函數(shù)返回值的類型。如果函數(shù)定義時(shí)不指類型符指明函數(shù)返回值的類型。如果函數(shù)定義時(shí)不指明類型,系統(tǒng)隱含指定為明類型,系統(tǒng)隱含指定為INT型。形式參
48、數(shù)又稱形參、型。形式參數(shù)又稱形參、虛參或啞元,有兩個(gè)作用:其一表示將從主調(diào)函數(shù)中虛參或啞元,有兩個(gè)作用:其一表示將從主調(diào)函數(shù)中接收哪些類型的信息,其二在函數(shù)體中形式參數(shù)可以接收哪些類型的信息,其二在函數(shù)體中形式參數(shù)可以被引用。被引用。3函數(shù)返回值由函數(shù)返回值由RETURN語(yǔ)句實(shí)現(xiàn),語(yǔ)句實(shí)現(xiàn),RETURN語(yǔ)句的語(yǔ)句的格式為:格式為:RETURN 表達(dá)式;函數(shù)先將表達(dá)式的值轉(zhuǎn)換為所定義的類型,然后返回函數(shù)先將表達(dá)式的值轉(zhuǎn)換為所定義的類型,然后返回到主調(diào)函數(shù)中的調(diào)用表達(dá)式。到主調(diào)函數(shù)中的調(diào)用表達(dá)式。4函數(shù)調(diào)用是通過(guò)函數(shù)調(diào)用表達(dá)式進(jìn)行,即:函數(shù)調(diào)用是通過(guò)函數(shù)調(diào)用表達(dá)式進(jìn)行,即:函數(shù)名(實(shí)際參數(shù)表)當(dāng)函
49、數(shù)被調(diào)用時(shí),計(jì)算機(jī)才為形參分配存儲(chǔ)空間。在函數(shù)調(diào)當(dāng)函數(shù)被調(diào)用時(shí),計(jì)算機(jī)才為形參分配存儲(chǔ)空間。在函數(shù)調(diào)用時(shí),函數(shù)之間的參數(shù)傳遞也稱為虛實(shí)結(jié)合。形參從相應(yīng)的用時(shí),函數(shù)之間的參數(shù)傳遞也稱為虛實(shí)結(jié)合。形參從相應(yīng)的實(shí)參得到值,稱為傳值調(diào)用方式。實(shí)參與形參在個(gè)數(shù)、類型實(shí)參得到值,稱為傳值調(diào)用方式。實(shí)參與形參在個(gè)數(shù)、類型上要匹配。當(dāng)調(diào)用結(jié)束,流程返回主調(diào)函數(shù)時(shí),形參所占空上要匹配。當(dāng)調(diào)用結(jié)束,流程返回主調(diào)函數(shù)時(shí),形參所占空間被釋放。間被釋放。5函數(shù)調(diào)用前應(yīng)該已經(jīng)定義或聲明,函數(shù)聲明的一般格式函數(shù)調(diào)用前應(yīng)該已經(jīng)定義或聲明,函數(shù)聲明的一般格式為:為:類型符 函數(shù)名(形參類型1 形參1, 形參類型2 形參2,);
50、或:或:類型符 函數(shù)名(形參類型1,形參類型2,);函數(shù)聲明與函數(shù)定義中的第一行(稱函數(shù)頭)內(nèi)容一致(也函數(shù)聲明與函數(shù)定義中的第一行(稱函數(shù)頭)內(nèi)容一致(也稱函數(shù)原型)。函數(shù)定義以函數(shù)體結(jié)尾,而函數(shù)聲明不包含稱函數(shù)原型)。函數(shù)定義以函數(shù)體結(jié)尾,而函數(shù)聲明不包含函數(shù)體。函數(shù)定義要求分配內(nèi)存單元,用來(lái)存放編譯后的函函數(shù)體。函數(shù)定義要求分配內(nèi)存單元,用來(lái)存放編譯后的函數(shù)指令,而函數(shù)聲明的作用只是通知編譯系統(tǒng)函數(shù)的參數(shù)個(gè)數(shù)指令,而函數(shù)聲明的作用只是通知編譯系統(tǒng)函數(shù)的參數(shù)個(gè)數(shù)和類型以及函數(shù)返回值的類型。數(shù)和類型以及函數(shù)返回值的類型。6函數(shù)的形參及函數(shù)內(nèi)定義的變量稱為局部變量,其作用函數(shù)的形參及函數(shù)內(nèi)定義
51、的變量稱為局部變量,其作用范圍在定義它的函數(shù)或復(fù)合語(yǔ)句內(nèi)。范圍在定義它的函數(shù)或復(fù)合語(yǔ)句內(nèi)。在函數(shù)外部定義的變量稱為全局變量,其作用域是從定義或在函數(shù)外部定義的變量稱為全局變量,其作用域是從定義或聲明處到整個(gè)程序結(jié)束。聲明處到整個(gè)程序結(jié)束。7變量的存儲(chǔ)類別指的是變量在計(jì)算機(jī)中的存放位置,變變量的存儲(chǔ)類別指的是變量在計(jì)算機(jī)中的存放位置,變量的存儲(chǔ)類有:自動(dòng)類(量的存儲(chǔ)類有:自動(dòng)類(AUTO)、外部類()、外部類(EXTERN)、)、靜態(tài)類(靜態(tài)類(STATIC)、寄存器類()、寄存器類(REGISTER)。它們具有)。它們具有不同的生存期和作用域。不同的生存期和作用域。 8一個(gè)函數(shù)被調(diào)用的過(guò)程中可以調(diào)用另一個(gè)函數(shù),即函數(shù)一個(gè)函數(shù)被調(diào)用的過(guò)程中可以調(diào)用另一個(gè)函數(shù),即函數(shù)調(diào)用允許嵌套。每一次調(diào)用時(shí),形參的值自動(dòng)壓入運(yùn)行棧,調(diào)用允許嵌套。每一次
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 住宅認(rèn)購(gòu)定金合同范本
- 倉(cāng)儲(chǔ)保管填寫合同范本
- 2025年四川貨運(yùn)從業(yè)資格證考試的技巧
- 一房三賣買賣合同范本
- 停息掛賬律師委托合同范本
- 個(gè)人外匯貸款合同范本
- 助資合同范本
- 個(gè)人買房購(gòu)房合同范本
- 公司稅貸合同范本
- 個(gè)人店面整體裝修合同范本
- 2025年太倉(cāng)市文化旅游發(fā)展集團(tuán)限公司及子公司公開招聘12名高頻重點(diǎn)提升(共500題)附帶答案詳解
- 安裝承包合同(2025年)
- 云上貴州大數(shù)據(jù)(集團(tuán))有限公司招聘筆試沖刺題2024
- 馬桶采購(gòu)合同范例
- 護(hù)理技能培訓(xùn)師競(jìng)聘
- 《世界各國(guó)簡(jiǎn)介》課件
- 北京市矢量地圖-可改顏色
- 新質(zhì)生產(chǎn)力與產(chǎn)品創(chuàng)新
- 2024年河北省公務(wù)員錄用考試《行測(cè)》真題及答案解析
- 安保服務(wù)行業(yè)市場(chǎng)調(diào)研分析報(bào)告
- 吉林大學(xué)《微積分AⅠ》2021-2022學(xué)年第一學(xué)期期末試卷
評(píng)論
0/150
提交評(píng)論