




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
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 變量的作用域與存儲類別變量的作用域與存儲類別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)一個用一個用C語言開發(fā)的軟件往往由許多功能模塊組成,各語言開發(fā)的軟件往往由許多功能模塊組成,各個功能模塊彼此有一定的聯(lián)系,功能上各自獨立。在個功能模塊彼此有一定的聯(lián)系,功能上各
2、自獨立。在C語言中,用函數(shù)來實現(xiàn)功能模塊的定義。通常一個具語言中,用函數(shù)來實現(xiàn)功能模塊的定義。通常一個具有一定規(guī)模的有一定規(guī)模的C程序往往由多個函數(shù)組成。其中有且僅程序往往由多個函數(shù)組成。其中有且僅有一個主函數(shù),由主函數(shù)來調(diào)用其他函數(shù)。如圖有一個主函數(shù),由主函數(shù)來調(diào)用其他函數(shù)。如圖6-1所所示是一個程序中函數(shù)調(diào)用的示意圖。示是一個程序中函數(shù)調(diào)用的示意圖。 圖圖6-1 C語言程序的模塊語言程序的模塊結(jié)構(gòu)結(jié)構(gòu)C語言中,函數(shù)可按多種方式來分類:語言中,函數(shù)可按多種方式來分類:(1)從使用的角度來分,可以分為標(biāo)準(zhǔn)函數(shù)和用戶函數(shù)。)從使用的角度來分,可以分為標(biāo)準(zhǔn)函數(shù)和用戶函數(shù)。(2)從形式上來分,可以分
3、為無參函數(shù)和有參函數(shù)。)從形式上來分,可以分為無參函數(shù)和有參函數(shù)。(3)從作用范圍來分,可以分為外部函數(shù)和內(nèi)部函數(shù)。)從作用范圍來分,可以分為外部函數(shù)和內(nèi)部函數(shù)。(4)從返回值來分,可以分為無返回值函數(shù)和有返回值函)從返回值來分,可以分為無返回值函數(shù)和有返回值函數(shù)。數(shù)。6.2 函數(shù)的定義與調(diào)用函數(shù)的定義與調(diào)用6.2.1 函數(shù)的定義函數(shù)的定義C語言函數(shù)的定義包括對函數(shù)名、函數(shù)的參數(shù)、函數(shù)返回值語言函數(shù)的定義包括對函數(shù)名、函數(shù)的參數(shù)、函數(shù)返回值的類型與函數(shù)功能的描述。的類型與函數(shù)功能的描述。 一般形式為:一般形式為:類型符 函數(shù)名(形式參數(shù)說明) 聲明與定義部分 語句部分1函數(shù)首部函數(shù)首部函數(shù)首部
4、用于對函數(shù)的特征進(jìn)行定義。類型符用于標(biāo)識函數(shù)函數(shù)首部用于對函數(shù)的特征進(jìn)行定義。類型符用于標(biāo)識函數(shù)返回值的類型。當(dāng)函數(shù)不返回值時,習(xí)慣用返回值的類型。當(dāng)函數(shù)不返回值時,習(xí)慣用VOID來標(biāo)記。來標(biāo)記。另外,當(dāng)函數(shù)返回另外,當(dāng)函數(shù)返回INT型值時,類型符型值時,類型符INT可以省略。可以省略。函數(shù)名是一個標(biāo)識符,在函數(shù)定義中,函數(shù)名后括號內(nèi)的形函數(shù)名是一個標(biāo)識符,在函數(shù)定義中,函數(shù)名后括號內(nèi)的形式參數(shù)(式參數(shù)(FORMAL PARAMETER)是按需要而設(shè)定的,也)是按需要而設(shè)定的,也可以沒有形式參數(shù),但函數(shù)名后一對圓括號必須保留。形式可以沒有形式參數(shù),但函數(shù)名后一對圓括號必須保留。形式參數(shù)簡稱形參
5、。參數(shù)簡稱形參。當(dāng)函數(shù)有形參時,在形參表中,除給出形參名外,還要指出當(dāng)函數(shù)有形參時,在形參表中,除給出形參名外,還要指出它的類型。一般形式為:它的類型。一般形式為:類型符 形參名1,類型符 形參名2,類型符 形參名N2函數(shù)體函數(shù)體在函數(shù)定義的最外層花括號括起來的部分稱作函數(shù)體。在函在函數(shù)定義的最外層花括號括起來的部分稱作函數(shù)體。在函數(shù)體的前面部分可以包含函數(shù)體中程序?qū)ο蟮穆暶骱妥兞慷〝?shù)體的前面部分可以包含函數(shù)體中程序?qū)ο蟮穆暶骱妥兞慷x,聲明和定義之后是描述函數(shù)功能的語句部分。義,聲明和定義之后是描述函數(shù)功能的語句部分。函數(shù)體中的函數(shù)體中的RETURN語句用于傳遞函數(shù)的返回值。一般格式語句用于
6、傳遞函數(shù)的返回值。一般格式為:為:RETURN 表達(dá)式;說明:說明:(1)一個函數(shù)中可以有多個)一個函數(shù)中可以有多個RETURN語句,當(dāng)執(zhí)行到某個語句,當(dāng)執(zhí)行到某個RETURN語句時,程序的控制流程返回調(diào)用函數(shù),并將語句時,程序的控制流程返回調(diào)用函數(shù),并將RETURN語句中表達(dá)式的值作為函數(shù)值帶回。語句中表達(dá)式的值作為函數(shù)值帶回。(2)若函數(shù)體內(nèi)沒有)若函數(shù)體內(nèi)沒有RETURN語句,就一直執(zhí)行到函數(shù)體語句,就一直執(zhí)行到函數(shù)體的末尾,然后返回調(diào)用函數(shù)。這時也有一個不確定的函數(shù)值的末尾,然后返回調(diào)用函數(shù)。這時也有一個不確定的函數(shù)值被帶回。被帶回。(3)若不需要帶回函數(shù)值,一般將函數(shù)定義為)若不需要
7、帶回函數(shù)值,一般將函數(shù)定義為VOID類型。類型。(4)RETURN語句中表達(dá)式的類型應(yīng)與函數(shù)返回值的類型語句中表達(dá)式的類型應(yīng)與函數(shù)返回值的類型一致。不一致時,以函數(shù)返回值的類型為準(zhǔn)。一致。不一致時,以函數(shù)返回值的類型為準(zhǔn)。3空函數(shù)空函數(shù)C語言還允許函數(shù)體為空的函數(shù),其形式為:語言還允許函數(shù)體為空的函數(shù),其形式為:函數(shù)名() 調(diào)用此函數(shù)時,什么工作也不做。調(diào)用此函數(shù)時,什么工作也不做。6.2.2 函數(shù)的調(diào)用函數(shù)的調(diào)用函數(shù)調(diào)用的一般形式為:函數(shù)調(diào)用的一般形式為:函數(shù)名(實在參數(shù)表)當(dāng)有多個實在參數(shù)(當(dāng)有多個實在參數(shù)(ACTUAL PARAMETER)時,實在參)時,實在參數(shù)之間用逗號分隔。數(shù)之間用
8、逗號分隔。如果調(diào)用的是無參數(shù)函數(shù),則調(diào)用形式為:如果調(diào)用的是無參數(shù)函數(shù),則調(diào)用形式為:函數(shù)名()其中函數(shù)名之后的一對括號不能省略。其中函數(shù)名之后的一對括號不能省略。函數(shù)調(diào)用時提供的實在參數(shù)(簡稱實參)應(yīng)與被調(diào)用函數(shù)的函數(shù)調(diào)用時提供的實在參數(shù)(簡稱實參)應(yīng)與被調(diào)用函數(shù)的形式參數(shù)按順序一一對應(yīng),而且參數(shù)類型要一致。形式參數(shù)按順序一一對應(yīng),而且參數(shù)類型要一致。按調(diào)用函數(shù)在程序中的作用不同,有兩種不同的應(yīng)用方式:按調(diào)用函數(shù)在程序中的作用不同,有兩種不同的應(yīng)用方式:(1)將函數(shù)調(diào)用作為一個獨立的語句。如前面例子中經(jīng)常)將函數(shù)調(diào)用作為一個獨立的語句。如前面例子中經(jīng)常使用的輸入輸出函數(shù)調(diào)用。這種應(yīng)用情況不要
9、求或無視函數(shù)使用的輸入輸出函數(shù)調(diào)用。這種應(yīng)用情況不要求或無視函數(shù)的返回值,需要的只是函數(shù)完成的操作。的返回值,需要的只是函數(shù)完成的操作。(2)函數(shù)調(diào)用作為表達(dá)式中的一個運(yùn)算量。這種應(yīng)用情況)函數(shù)調(diào)用作為表達(dá)式中的一個運(yùn)算量。這種應(yīng)用情況要求函數(shù)調(diào)用能返回一個值,參與表達(dá)式的計算。要求函數(shù)調(diào)用能返回一個值,參與表達(dá)式的計算?!纠?.1】求五邊形面積,長度求五邊形面積,長度L1L7從鍵盤輸入。從鍵盤輸入。6.2.3 對被調(diào)用函數(shù)的聲明和函數(shù)原型對被調(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ù)中對被調(diào)用函定義在調(diào)用函數(shù)之后出現(xiàn),就必須在調(diào)用函數(shù)中對被調(diào)用函數(shù)加以聲明,函數(shù)聲明的一般形式為:數(shù)加以聲明,函數(shù)聲明的一般形式為:類型符 函數(shù)名(形參類型1 形參名1,形參類型2 形參名2,);這種形式的函數(shù)聲明只是對已定義的函數(shù)名及其返回值的類這種形式的函數(shù)聲明只是對已定義的函數(shù)名及其返回值的類型、參數(shù)個數(shù)及參數(shù)類型作聲明,以便讓編譯程序預(yù)先知道型、參數(shù)個數(shù)及參數(shù)類型作聲明,以便讓編譯程序預(yù)先知道該標(biāo)識符是函數(shù)和函數(shù)返回值的類型,為該函數(shù)的調(diào)用編譯該標(biāo)識符是函數(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ù)具體的功能語句,即函數(shù)體,而上面內(nèi)容之外,應(yīng)有函數(shù)具體的功能語句,即函數(shù)體,而函數(shù)的聲明(函數(shù)的聲明(DECLARATION)僅是對編譯系統(tǒng)的一個)僅是對編譯系統(tǒng)的一個說明,不含具體的執(zhí)行動作。說明,不含具體的執(zhí)行動作。(2)在程序中,函數(shù)的定義只能有一次,而函數(shù)的聲明)在程序中,函數(shù)的定義只能有一次,而函數(shù)的聲明可以有多次,有多少個主
12、調(diào)函數(shù)要調(diào)用該被調(diào)函數(shù),就應(yīng)可以有多次,有多少個主調(diào)函數(shù)要調(diào)用該被調(diào)函數(shù),就應(yīng)在各個主調(diào)函數(shù)中各自進(jìn)行聲明。在各個主調(diào)函數(shù)中各自進(jìn)行聲明?!纠?.2】計算并輸出計算并輸出Y的值。的值。以下幾種情況下,可省略函數(shù)聲明:以下幾種情況下,可省略函數(shù)聲明:(1)如果被調(diào)用函數(shù)的定義出現(xiàn)在調(diào)用它之前,根據(jù))如果被調(diào)用函數(shù)的定義出現(xiàn)在調(diào)用它之前,根據(jù)C語言語言的定義隱含著聲明原則,可以不必對被調(diào)用函數(shù)作聲明。例的定義隱含著聲明原則,可以不必對被調(diào)用函數(shù)作聲明。例6.1即是這種情況。即是這種情況。(2)如被調(diào)用函數(shù)的返回值是整型或字符型,也可以不對)如被調(diào)用函數(shù)的返回值是整型或字符型,也可以不對它作聲明。
13、因編譯系統(tǒng)發(fā)現(xiàn)程序調(diào)用一個還未被定義或聲明它作聲明。因編譯系統(tǒng)發(fā)現(xiàn)程序調(diào)用一個還未被定義或聲明的函數(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)用另一個源程序文件中定義的函種情況外,包括調(diào)用另一個源程序文件中定義的
14、函數(shù),都應(yīng)對被調(diào)用函數(shù)在調(diào)用它之前作聲明。數(shù),都應(yīng)對被調(diào)用函數(shù)在調(diào)用它之前作聲明。2函數(shù)原型的概念函數(shù)原型的概念在對被調(diào)函數(shù)的聲明時,編譯系統(tǒng)需知道被調(diào)函數(shù)有幾個參在對被調(diào)函數(shù)的聲明時,編譯系統(tǒng)需知道被調(diào)函數(shù)有幾個參數(shù),各自是什么類型,而參數(shù)的名字是無關(guān)緊要的,因此,數(shù),各自是什么類型,而參數(shù)的名字是無關(guān)緊要的,因此,對被調(diào)函數(shù)的聲明也稱為函數(shù)原型(對被調(diào)函數(shù)的聲明也稱為函數(shù)原型(PROTOTYPE),函數(shù)),函數(shù)原型也可以簡化為:原型也可以簡化為:類型符 函數(shù)名(形參類型1,形參類型2,)6.3 函數(shù)的參數(shù)傳遞函數(shù)的參數(shù)傳遞在在C語言中,實參向形參傳送數(shù)據(jù)的方式是語言中,實參向形參傳送數(shù)據(jù)的
15、方式是“值傳遞值傳遞”,即實,即實參的值傳給形參,是一種單向傳遞方式,不能由形參傳回給參的值傳給形參,是一種單向傳遞方式,不能由形參傳回給實參。在函數(shù)執(zhí)行過程中,形參的值可能被改變,但這改變實參。在函數(shù)執(zhí)行過程中,形參的值可能被改變,但這改變對原來與它對應(yīng)的實參沒有影響。對原來與它對應(yīng)的實參沒有影響。值傳遞的優(yōu)點在于被調(diào)用的函數(shù)不可能改變主調(diào)函數(shù)中變量值傳遞的優(yōu)點在于被調(diào)用的函數(shù)不可能改變主調(diào)函數(shù)中變量的值,而只能改變它的局部的臨時副本。這樣就可以避免被的值,而只能改變它的局部的臨時副本。這樣就可以避免被調(diào)用函數(shù)的操作對調(diào)用函數(shù)中的變量可能產(chǎn)生的副作用。調(diào)用函數(shù)的操作對調(diào)用函數(shù)中的變量可能產(chǎn)生
16、的副作用。C語言中,在值傳遞方式下,既可以在函數(shù)之間傳遞語言中,在值傳遞方式下,既可以在函數(shù)之間傳遞“變量的變量的值值”,也可以在函數(shù)之間傳遞,也可以在函數(shù)之間傳遞“變量的地址變量的地址”?!纠?.3】分析形參和實參的結(jié)合過程。分析形參和實參的結(jié)合過程。6.4 函數(shù)的嵌套調(diào)用與遞歸調(diào)用函數(shù)的嵌套調(diào)用與遞歸調(diào)用6.4.1 函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用在在C語言的函數(shù)定義內(nèi)不能再定義別的函數(shù),但一個函數(shù)為語言的函數(shù)定義內(nèi)不能再定義別的函數(shù),但一個函數(shù)為實現(xiàn)它的功能,可以調(diào)用其他函數(shù)。實現(xiàn)它的功能,可以調(diào)用其他函數(shù)。圖圖6-4示意了函數(shù)嵌套調(diào)用關(guān)系,其中編號表示執(zhí)行控制變示意了函數(shù)嵌套調(diào)用關(guān)系,其
17、中編號表示執(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遞歸的基本概念遞歸的基本概念在一個程序中,若存在程序自己調(diào)用自己的現(xiàn)象就是構(gòu)成了在一個程序中,若存在程序自己調(diào)用自己的現(xiàn)象就是構(gòu)成了遞歸。遞歸。C語言允許函數(shù)的遞歸調(diào)用。在調(diào)用一個函數(shù)的過程語言允許函數(shù)的遞歸調(diào)用。在調(diào)用一個函數(shù)的過程中又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸調(diào)中又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸調(diào)用。如果函數(shù)用。如果函數(shù)A在執(zhí)行過
18、程中又調(diào)用函數(shù)在執(zhí)行過程中又調(diào)用函數(shù)A自己,則稱函數(shù)自己,則稱函數(shù)A為直接遞歸。如果函數(shù)為直接遞歸。如果函數(shù)A在執(zhí)行過程中先調(diào)用函數(shù)在執(zhí)行過程中先調(diào)用函數(shù)B,函數(shù),函數(shù)B在執(zhí)行過程中又調(diào)用函數(shù)在執(zhí)行過程中又調(diào)用函數(shù)A,則稱函數(shù),則稱函數(shù)A為間接遞歸。程序為間接遞歸。程序設(shè)計中常用的是直接遞歸。設(shè)計中常用的是直接遞歸。數(shù)學(xué)上遞歸定義的函數(shù)是非常多的。例如,當(dāng)數(shù)學(xué)上遞歸定義的函數(shù)是非常多的。例如,當(dāng)N為自然數(shù)時,為自然數(shù)時,求求N的階乘的階乘N!。2遞歸程序的執(zhí)行過程遞歸程序的執(zhí)行過程用一個簡單的遞歸程序來分析遞歸程序的執(zhí)行過程。用一個簡單的遞歸程序來分析遞歸程序的執(zhí)行過程?!纠?.5】求求N!
19、的遞歸函數(shù)。的遞歸函數(shù)。 圖圖6-6 FAC(3)的計算流程的計算流程3數(shù)值型遞歸問題的求解方法數(shù)值型遞歸問題的求解方法在掌握遞歸的基本概念和遞歸程序的執(zhí)行過程之后,還應(yīng)掌在掌握遞歸的基本概念和遞歸程序的執(zhí)行過程之后,還應(yīng)掌握編寫遞歸程序的基本方法。編寫遞歸程序要注意兩點,一握編寫遞歸程序的基本方法。編寫遞歸程序要注意兩點,一要找出正確的遞歸算法,這是編寫遞歸程序的基礎(chǔ);二要確要找出正確的遞歸算法,這是編寫遞歸程序的基礎(chǔ);二要確定算法的遞歸結(jié)束條件,這是決定遞歸程序能否正常結(jié)束的定算法的遞歸結(jié)束條件,這是決定遞歸程序能否正常結(jié)束的關(guān)鍵。關(guān)鍵。【例例6.6】用遞歸方法計算多項式函數(shù)的值。用遞歸方
20、法計算多項式函數(shù)的值。4非數(shù)值型遞歸問題的求解方法非數(shù)值型遞歸問題的求解方法對于非數(shù)值問題,編寫遞歸程序的一般方法是:確定問題的對于非數(shù)值問題,編寫遞歸程序的一般方法是:確定問題的最小模型并使用非遞歸算法解決,分解原來的非數(shù)值問題建最小模型并使用非遞歸算法解決,分解原來的非數(shù)值問題建立遞歸模型,確定遞歸模型的終止條件,將遞歸模型轉(zhuǎn)換為立遞歸模型,確定遞歸模型的終止條件,將遞歸模型轉(zhuǎn)換為遞歸程序。遞歸程序。尋找非數(shù)值問題的遞歸算法可從分析問題本身的規(guī)律入手,尋找非數(shù)值問題的遞歸算法可從分析問題本身的規(guī)律入手,按照下列步驟進(jìn)行分析:按照下列步驟進(jìn)行分析:(1)從化簡問題開始。將問題進(jìn)行簡化,將問題
21、的規(guī)模縮)從化簡問題開始。將問題進(jìn)行簡化,將問題的規(guī)??s到最小,分析問題在最簡單情況下的求解方法。此時找到的到最小,分析問題在最簡單情況下的求解方法。此時找到的求解方法應(yīng)當(dāng)十分簡單。求解方法應(yīng)當(dāng)十分簡單。(2)對于一個一般的問題,可將一個大問題分解為兩個)對于一個一般的問題,可將一個大問題分解為兩個(或若干個)小問題,使原來的大問題變成這兩個(或若干(或若干個)小問題,使原來的大問題變成這兩個(或若干個)小問題的組合,其中至少有一個小問題與原來的問題有個)小問題的組合,其中至少有一個小問題與原來的問題有相同的性質(zhì),只是在問題的規(guī)模上與原來的問題相比較有所相同的性質(zhì),只是在問題的規(guī)模上與原來的問
22、題相比較有所縮小。縮小。(3)將分解后的每個小問題作為一個整體,描述用這)將分解后的每個小問題作為一個整體,描述用這些較小的問題來解決原來大問題的算法。些較小的問題來解決原來大問題的算法。由第(由第(3)步得到的算法就是一個解決原來問題的遞歸)步得到的算法就是一個解決原來問題的遞歸算法。由第(算法。由第(1)步將問題的規(guī)??s到最小時的條件就)步將問題的規(guī)??s到最小時的條件就是該遞歸算法的遞歸結(jié)束條件。是該遞歸算法的遞歸結(jié)束條件?!纠?.7】利用遞歸函數(shù)打印如圖利用遞歸函數(shù)打印如圖6-7所示的數(shù)字金字塔所示的數(shù)字金字塔圖形。圖形。圖圖6-7 數(shù)字金字塔數(shù)字金字塔5關(guān)于遞歸的幾點說明關(guān)于遞歸的幾
23、點說明當(dāng)一個問題蘊(yùn)含了遞歸關(guān)系且結(jié)構(gòu)比較復(fù)雜時,采用遞歸調(diào)當(dāng)一個問題蘊(yùn)含了遞歸關(guān)系且結(jié)構(gòu)比較復(fù)雜時,采用遞歸調(diào)用的程序設(shè)計技巧可以使程序變得簡潔,增加了程序的可讀用的程序設(shè)計技巧可以使程序變得簡潔,增加了程序的可讀性。但遞歸調(diào)用本身是以犧牲存儲空間為基礎(chǔ)的,因為每一性。但遞歸調(diào)用本身是以犧牲存儲空間為基礎(chǔ)的,因為每一次遞歸調(diào)用都要保存相關(guān)的參數(shù)和變量。同樣,遞歸本身也次遞歸調(diào)用都要保存相關(guān)的參數(shù)和變量。同樣,遞歸本身也不會加快執(zhí)行速度;相反,由于反復(fù)調(diào)用函數(shù),還會或多或不會加快執(zhí)行速度;相反,由于反復(fù)調(diào)用函數(shù),還會或多或少地增加時間開銷。遞歸調(diào)用能使代碼緊湊,并能夠很容易少地增加時間開銷。遞歸
24、調(diào)用能使代碼緊湊,并能夠很容易地解決一些用非遞歸算法很難解決的問題。地解決一些用非遞歸算法很難解決的問題。注意:所有的遞歸問題都一定可以用非遞歸的算法實現(xiàn),并注意:所有的遞歸問題都一定可以用非遞歸的算法實現(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 變量的作用域與存儲類別變量的作用域與存儲類別6.5.1 變量的作用域變量的作用域在程序中能對變量進(jìn)行存取操作的范圍稱為變量的作用域。在
25、程序中能對變量進(jìn)行存取操作的范圍稱為變量的作用域。根據(jù)變量的作用域不同,變量分為局部變量和全局變量。根據(jù)變量的作用域不同,變量分為局部變量和全局變量。1局部變量局部變量在一個函數(shù)體內(nèi)或復(fù)合語句內(nèi)定義的變量稱為局部變量。局在一個函數(shù)體內(nèi)或復(fù)合語句內(nèi)定義的變量稱為局部變量。局部變量只在定義它的函數(shù)體或復(fù)合語句內(nèi)有效,即只能在定部變量只在定義它的函數(shù)體或復(fù)合語句內(nèi)有效,即只能在定義它的函數(shù)體或復(fù)合語句內(nèi)部使用它,而在定義它的函數(shù)體義它的函數(shù)體或復(fù)合語句內(nèi)部使用它,而在定義它的函數(shù)體或復(fù)合語句之外不能使用它。或復(fù)合語句之外不能使用它。2全局變量全局變量在函數(shù)定義之外定義的變量稱為全局變量。全局變量可以
26、在在函數(shù)定義之外定義的變量稱為全局變量。全局變量可以在定義它的文件中使用,其作用域是從它的定義處開始到變量定義它的文件中使用,其作用域是從它的定義處開始到變量所在文件的末尾。所在文件的末尾。說明:說明:(1)全局變量在程序執(zhí)行期間一直存在,一個全局變量也)全局變量在程序執(zhí)行期間一直存在,一個全局變量也可被位于它定義之前的函數(shù)使用,甚至別的源程序文件中的可被位于它定義之前的函數(shù)使用,甚至別的源程序文件中的函數(shù)使用,但需在使用之前給出外部變量的聲明(用關(guān)鍵字函數(shù)使用,但需在使用之前給出外部變量的聲明(用關(guān)鍵字EXTERN)。)?!纠?.8】寫出以下程序輸出結(jié)果。寫出以下程序輸出結(jié)果。(2)在同一
27、源文件中,如果全部變量與局部變量同名,則)在同一源文件中,如果全部變量與局部變量同名,則在局部變量的作用范圍內(nèi),全局變量不起作用。在局部變量的作用范圍內(nèi),全局變量不起作用?!纠?.9】寫出程序的輸出結(jié)果。寫出程序的輸出結(jié)果。(3)在程序中定義全局變量的主要目的是為函數(shù)間的數(shù)據(jù))在程序中定義全局變量的主要目的是為函數(shù)間的數(shù)據(jù)聯(lián)系提供一個直接傳遞的通道。在某些應(yīng)用中,函數(shù)將執(zhí)行聯(lián)系提供一個直接傳遞的通道。在某些應(yīng)用中,函數(shù)將執(zhí)行結(jié)果保留在全局變量中,使函數(shù)能返回多個值。在另一些應(yīng)結(jié)果保留在全局變量中,使函數(shù)能返回多個值。在另一些應(yīng)用中,將部分參數(shù)信息放在全局變量中,以減少函數(shù)調(diào)用時用中,將部分參
28、數(shù)信息放在全局變量中,以減少函數(shù)調(diào)用時的參數(shù)傳遞。因程序中的多個函數(shù)能使用全局變量,其中某的參數(shù)傳遞。因程序中的多個函數(shù)能使用全局變量,其中某個函數(shù)改變?nèi)肿兞康闹稻涂赡軙绊懫渌瘮?shù)的執(zhí)行,產(chǎn)個函數(shù)改變?nèi)肿兞康闹稻涂赡軙绊懫渌瘮?shù)的執(zhí)行,產(chǎn)生副作用。生副作用。6.5.2 變量的存儲類別變量的存儲類別變量具有可訪問性和存在性兩種基本屬性。前面介紹的變量變量具有可訪問性和存在性兩種基本屬性。前面介紹的變量作用域是指在程序的某個范圍內(nèi)的所有語句都可以通過變量作用域是指在程序的某個范圍內(nèi)的所有語句都可以通過變量名訪問該變量,即代表變量的可訪問性。名訪問該變量,即代表變量的可訪問性。在計算機(jī)中,保
29、存變量當(dāng)前值的存儲單元有兩類:一類是內(nèi)在計算機(jī)中,保存變量當(dāng)前值的存儲單元有兩類:一類是內(nèi)存,另一類是存,另一類是CPU中的寄存器。變量的存儲類別就是討論變中的寄存器。變量的存儲類別就是討論變量的存儲位置,量的存儲位置,C語言中定義了語言中定義了4種存儲類別,即自動種存儲類別,即自動(AUTO)變量、外部()變量、外部(EXTERN)變量、靜態(tài)()變量、靜態(tài)(STATIC)變量和寄存器(變量和寄存器(REGISTER)變量,它關(guān)系到變量在內(nèi)存中)變量,它關(guān)系到變量在內(nèi)存中的存放位置。的存放位置。C語言用變量的存儲類別指明變量的存在性,語言用變量的存儲類別指明變量的存在性,可分為兩大類:靜態(tài)存儲
30、和動態(tài)存儲。所謂靜態(tài)存儲是指在可分為兩大類:靜態(tài)存儲和動態(tài)存儲。所謂靜態(tài)存儲是指在程序運(yùn)行期間分配固定的存儲空間,而動態(tài)存儲則是在程序程序運(yùn)行期間分配固定的存儲空間,而動態(tài)存儲則是在程序運(yùn)行期間根據(jù)需要動態(tài)分配存儲空間。運(yùn)行期間根據(jù)需要動態(tài)分配存儲空間。變量的可訪問性與存在性在某些場合是一致的,但在有些場變量的可訪問性與存在性在某些場合是一致的,但在有些場合則不一致。存在這樣的情況,一個變量在某時刻雖然存在,合則不一致。存在這樣的情況,一個變量在某時刻雖然存在,但此時不可訪問它。但此時不可訪問它。1局部變量的存儲類別局部變量的存儲類別(1)自動變量。)自動變量。(2)局部靜態(tài)變量。)局部靜態(tài)變
31、量?!纠?.10】寫出程序的輸出結(jié)果。寫出程序的輸出結(jié)果。(3)寄存器變量。)寄存器變量。另有兩點需特別指出,其一是寄存器變量不能執(zhí)行取地址運(yùn)另有兩點需特別指出,其一是寄存器變量不能執(zhí)行取地址運(yùn)算(用運(yùn)算符算(用運(yùn)算符&);其二是寄存器變量不能是靜態(tài)變量。);其二是寄存器變量不能是靜態(tài)變量。2全局變量的存儲類別全局變量的存儲類別全局變量是在函數(shù)之外定義的變量,編譯時按靜態(tài)方式分配全局變量是在函數(shù)之外定義的變量,編譯時按靜態(tài)方式分配存儲單元。全局變量可以為程序中各個函數(shù)所引用。存儲單元。全局變量可以為程序中各個函數(shù)所引用。一個一個C程序可以由一個或多個源程序文件組成,而全局變量程序可以
32、由一個或多個源程序文件組成,而全局變量定義的作用域是從它的定義處開始到源程序文件的末尾。如定義的作用域是從它的定義處開始到源程序文件的末尾。如果在位于全局變量定義之前的函數(shù)中要引用該全局變量,需果在位于全局變量定義之前的函數(shù)中要引用該全局變量,需在引用之前對它作外部變量聲明。同樣地,如果在定義全局在引用之前對它作外部變量聲明。同樣地,如果在定義全局變量源文件之外的源文件中引用該全局變量,也需在引用之變量源文件之外的源文件中引用該全局變量,也需在引用之前對它作外部變量聲明。在變量定義之前冠以關(guān)鍵字前對它作外部變量聲明。在變量定義之前冠以關(guān)鍵字EXTERN,就聲明變量是外部變量。,就聲明變量是外部
33、變量。為了表明變量是靜態(tài)的,在變量定義時冠以關(guān)鍵字為了表明變量是靜態(tài)的,在變量定義時冠以關(guān)鍵字STATIC。在在C語言中,語言中,“靜態(tài)靜態(tài)”包含兩方面的意義。從程序?qū)ο笤诔绦虬瑑煞矫娴囊饬x。從程序?qū)ο笤诔绦驁?zhí)行期間的存在性來看,靜態(tài)表示該程序?qū)ο髨?zhí)行期間的存在性來看,靜態(tài)表示該程序?qū)ο蟆坝谰糜谰谩贝嬖凇4嬖?。從程序?qū)ο罂稍L問或可調(diào)用來看,靜態(tài)表示該程序?qū)ο蟮膶某绦驅(qū)ο罂稍L問或可調(diào)用來看,靜態(tài)表示該程序?qū)ο蟮膶S锰匦?。具體表現(xiàn)在,局部靜態(tài)變量只有定義它的函數(shù)可訪用特性。具體表現(xiàn)在,局部靜態(tài)變量只有定義它的函數(shù)可訪問,全局靜態(tài)變量只有在定義它的源文件中可訪問或可調(diào)用。問,全局靜態(tài)變量只有在定
34、義它的源文件中可訪問或可調(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ù)FACTORIAL的作用范圍僅局限于定義它的文件,的作用范圍僅
35、局限于定義它的文件,而在其他源文件中不能調(diào)用此函數(shù)。如果在不同的源文件中而在其他源文件中不能調(diào)用此函數(shù)。如果在不同的源文件中存在同名的內(nèi)部函數(shù),它們互不干擾。存在同名的內(nèi)部函數(shù),它們互不干擾。6.6.2 外部函數(shù)外部函數(shù)因為函數(shù)與函數(shù)之間都是并列的,即函數(shù)不能嵌套定義,所因為函數(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ù)所在的源文件,而是整個程序的所作用范圍不只局限于函數(shù)所在的源文件,而是整個程序的所有文件。有時為了明確這種性質(zhì),可以在函數(shù)定義和調(diào)用時有文件。有時為了明確這種性質(zhì),可以在函數(shù)定義和調(diào)用時使用關(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ǐn)?shù)規(guī)則進(jìn)行加減法的程序。其中設(shè)計一個按分?jǐn)?shù)規(guī)則進(jìn)行加減法的程序。其中I=KMNL,J=LM,I、J的最大公約數(shù)為的最大公約數(shù)為1?!纠?.13】設(shè)計一個程序,求同時滿足下列兩個條件的分?jǐn)?shù)設(shè)計一個程序,求同時滿足下列兩個條件的分?jǐn)?shù)X的個數(shù):的個數(shù):(1)1/6X1/5。(2)X的分子分母都是素數(shù)且分母是的分子分母都是素數(shù)且分母是2位數(shù)。位數(shù)。【例例6.14】漢諾(漢諾(HANOI)塔問題。有)塔問題。有3根柱子根柱子A、B、C,A上堆放了上堆放了N個盤子,盤子大小不等,大的在下,小的在上,個盤子,盤子大小不等,大的在下,小的在上,如圖如圖6-8所示?,F(xiàn)在要求把這所
38、示?,F(xiàn)在要求把這N個盤子從個盤子從A搬到搬到C,在搬動過,在搬動過程中可以借助程中可以借助B作為中轉(zhuǎn),每次只允許搬動一個盤子,且在作為中轉(zhuǎn),每次只允許搬動一個盤子,且在移動過程中在移動過程中在3根柱子上都保持大盤在下,小盤在上。要求根柱子上都保持大盤在下,小盤在上。要求打印出移動的步驟。打印出移動的步驟。 A B C 圖圖6-8 漢諾塔問題漢諾塔問題6.8 編譯預(yù)處理編譯預(yù)處理C語言共有語言共有3種編譯預(yù)處理命令,即宏定義、文件包含種編譯預(yù)處理命令,即宏定義、文件包含和條件編譯。和條件編譯。6.8.1 宏定義宏定義C語言有兩種宏定義命令:帶參數(shù)的宏定義和不帶參數(shù)語言有兩種宏定義命令:帶參數(shù)的宏
39、定義和不帶參數(shù)的宏定義。的宏定義。 不帶參數(shù)的宏定義格式比較簡單,通常不帶參數(shù)的宏定義格式比較簡單,通常用來定義符號常量,其格式為:用來定義符號常量,其格式為:#DEFINE 宏名 字符序列其中宏名是一個標(biāo)識符。其中宏名是一個標(biāo)識符。為了和變量有所區(qū)別,習(xí)慣上定義符號常量時只使用為了和變量有所區(qū)別,習(xí)慣上定義符號常量時只使用大寫字母,但并不是非大寫不可。大寫字母,但并不是非大寫不可。使用符號常量有兩點好處:一是程序可讀性好,易于使用符號常量有兩點好處:一是程序可讀性好,易于閱讀理解;二是有利于程序的調(diào)試和修改。閱讀理解;二是有利于程序的調(diào)試和修改。在定義宏時還可以加上參數(shù),這就構(gòu)成了帶參數(shù)的宏
40、:在定義宏時還可以加上參數(shù),這就構(gòu)成了帶參數(shù)的宏:#DEFINE 宏名(參數(shù)表) 帶有參數(shù)的字符序列帶參數(shù)的宏和函數(shù)之間有以下的區(qū)別:帶參數(shù)的宏和函數(shù)之間有以下的區(qū)別:(1)函數(shù)調(diào)用時先求實參表達(dá)式的值,再傳給形參。而帶)函數(shù)調(diào)用時先求實參表達(dá)式的值,再傳給形參。而帶參數(shù)的宏只是簡單的字符替換,宏展開時并不對實參表達(dá)式參數(shù)的宏只是簡單的字符替換,宏展開時并不對實參表達(dá)式求值。函數(shù)調(diào)用時臨時分配存儲單元,宏替換并不分配存儲求值。函數(shù)調(diào)用時臨時分配存儲單元,宏替換并不分配存儲單元,也沒有返回值。單元,也沒有返回值。(2)宏比函數(shù)快。宏替換只占編譯時間,不占運(yùn)行時間。)宏比函數(shù)快。宏替換只占編譯時間
41、,不占運(yùn)行時間。但函數(shù)調(diào)用時分配存儲單元、傳值、返回值時都占時間。但函數(shù)調(diào)用時分配存儲單元、傳值、返回值時都占時間。(3)使用宏的程序代碼較長,因為宏在程序中存在了多次,)使用宏的程序代碼較長,因為宏在程序中存在了多次,而使用函數(shù)時,雖然多次調(diào)用,但函數(shù)代碼只存在一次。而使用函數(shù)時,雖然多次調(diào)用,但函數(shù)代碼只存在一次。(4)宏調(diào)用與宏定義之間可以不考慮參數(shù)的類型,而函數(shù))宏調(diào)用與宏定義之間可以不考慮參數(shù)的類型,而函數(shù)調(diào)用對實參有類型要求。調(diào)用對實參有類型要求。(5)一般情況下,調(diào)用函數(shù)只能得到一個返回值,而用宏)一般情況下,調(diào)用函數(shù)只能得到一個返回值,而用宏可以設(shè)法得到幾個結(jié)果??梢栽O(shè)法得到幾
42、個結(jié)果。6.8.2 文件包含文件包含所謂文件包含是指將另一個源程序文件嵌入到正在進(jìn)所謂文件包含是指將另一個源程序文件嵌入到正在進(jìn)行編譯預(yù)處理的源程序中的相應(yīng)位置上。文件包含命行編譯預(yù)處理的源程序中的相應(yīng)位置上。文件包含命令的格式為:令的格式為:#INCLUDE 或者:或者:#INCLUDE “文件名”其中文件名是指被嵌入的源程序文件的文件名,必須其中文件名是指被嵌入的源程序文件的文件名,必須用雙引號或者尖括號括起來。用雙引號或者尖括號括起來。【例例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ù)條件對條件編譯是指根據(jù)條件對C程序的部分語句進(jìn)行編譯,程序的部分語句進(jìn)行編譯,其他語句不編譯。條件編譯命令有其他語句不編譯。條件編譯命令有3種形式。種形式。形式形式1:#IFDEF 標(biāo)識符 程序段1 #ELSE 程序段2#ENDIF其作用是當(dāng)標(biāo)識符已被定義(常用宏定義),則對程其作用是當(dāng)標(biāo)識符已被定義(常用宏定義),則對程序段序段1進(jìn)行編譯,否則對程序段進(jìn)行編譯,否則對程序段2進(jìn)行編譯。其中如果進(jìn)行編譯。其中如
44、果程序段程序段2為空,為空,#ELSE部分可以省略。部分可以省略。這里的程序段可以是任何這里的程序段可以是任何C代碼行,也可以包含預(yù)處理命令代碼行,也可以包含預(yù)處理命令行。其中的標(biāo)識符只要求已定義與否,與標(biāo)識符被定義成什行。其中的標(biāo)識符只要求已定義與否,與標(biāo)識符被定義成什么無關(guān)。如標(biāo)識符只用于這個目的,常用以下形式的宏定義么無關(guān)。如標(biāo)識符只用于這個目的,常用以下形式的宏定義來定義這類標(biāo)識符:來定義這類標(biāo)識符:#DEFINE 標(biāo)識符即標(biāo)識符之后為空,直接以換行結(jié)束該宏定義命令。即標(biāo)識符之后為空,直接以換行結(jié)束該宏定義命令。形式形式2:#IFNDEF 標(biāo)識符 程序段1#ELSE 程序段2 #END
45、IF與形式與形式1的條件編譯命令的唯一差異是第一行的的條件編譯命令的唯一差異是第一行的IFDEF改為改為IFNDEF。其作用是當(dāng)標(biāo)識符未被定義時,編譯程序段。其作用是當(dāng)標(biāo)識符未被定義時,編譯程序段1,否,否則編譯程序段則編譯程序段2。形式形式3:#IF 表達(dá)式 程序段1 #ELSE 程序段2#ENDIF其中表達(dá)式為常量表達(dá)式,其作用是當(dāng)指定的表達(dá)式值為非其中表達(dá)式為常量表達(dá)式,其作用是當(dāng)指定的表達(dá)式值為非零時,編譯程序段零時,編譯程序段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語言進(jìn)行結(jié)構(gòu)化程序設(shè)計的最基本的概念,語言進(jìn)行結(jié)構(gòu)化程序設(shè)計的最基本的概念,C程序是由函數(shù)組成的??梢园岩粋€復(fù)雜的程序分成多個模程序是由函
47、數(shù)組成的。可以把一個復(fù)雜的程序分成多個模塊進(jìn)行設(shè)計,而每個模塊是一個函數(shù)。塊進(jìn)行設(shè)計,而每個模塊是一個函數(shù)。MAIN()是是C程序中最程序中最重要的函數(shù),程序運(yùn)行從函數(shù)重要的函數(shù),程序運(yùn)行從函數(shù)MAIN()開始,也在函數(shù)開始,也在函數(shù)MAIN()結(jié)束。在函數(shù)結(jié)束。在函數(shù)MAIN()的執(zhí)行過程中,可以調(diào)用其他的執(zhí)行過程中,可以調(diào)用其他函數(shù)。函數(shù)。2函數(shù)定義的一般形式為:函數(shù)定義的一般形式為:類型符 函數(shù)名(形式參數(shù)說明) 聲明與定義部分 語句部分類型符指明函數(shù)返回值的類型。如果函數(shù)定義時不指類型符指明函數(shù)返回值的類型。如果函數(shù)定義時不指明類型,系統(tǒng)隱含指定為明類型,系統(tǒng)隱含指定為INT型。形式參
48、數(shù)又稱形參、型。形式參數(shù)又稱形參、虛參或啞元,有兩個作用:其一表示將從主調(diào)函數(shù)中虛參或啞元,有兩個作用:其一表示將從主調(diào)函數(shù)中接收哪些類型的信息,其二在函數(shù)體中形式參數(shù)可以接收哪些類型的信息,其二在函數(shù)體中形式參數(shù)可以被引用。被引用。3函數(shù)返回值由函數(shù)返回值由RETURN語句實現(xiàn),語句實現(xiàn),RETURN語句的語句的格式為:格式為: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)用是通過函數(shù)調(diào)用表達(dá)式進(jìn)行,即:函數(shù)調(diào)用是通過函數(shù)調(diào)用表達(dá)式進(jìn)行,即:函數(shù)名(實際參數(shù)表)當(dāng)函
49、數(shù)被調(diào)用時,計算機(jī)才為形參分配存儲空間。在函數(shù)調(diào)當(dāng)函數(shù)被調(diào)用時,計算機(jī)才為形參分配存儲空間。在函數(shù)調(diào)用時,函數(shù)之間的參數(shù)傳遞也稱為虛實結(jié)合。形參從相應(yīng)的用時,函數(shù)之間的參數(shù)傳遞也稱為虛實結(jié)合。形參從相應(yīng)的實參得到值,稱為傳值調(diào)用方式。實參與形參在個數(shù)、類型實參得到值,稱為傳值調(diào)用方式。實參與形參在個數(shù)、類型上要匹配。當(dāng)調(diào)用結(jié)束,流程返回主調(diào)函數(shù)時,形參所占空上要匹配。當(dāng)調(diào)用結(jié)束,流程返回主調(diào)函數(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)存單元,用來存放編譯后的函函數(shù)體。函數(shù)定義要求分配內(nèi)存單元,用來存放編譯后的函數(shù)指令,而函數(shù)聲明的作用只是通知編譯系統(tǒng)函數(shù)的參數(shù)個數(shù)指令,而函數(shù)聲明的作用只是通知編譯系統(tǒng)函數(shù)的參數(shù)個數(shù)和類型以及函數(shù)返回值的類型。數(shù)和類型以及函數(shù)返回值的類型。6函數(shù)的形參及函數(shù)內(nèi)定義的變量稱為局部變量,其作用函數(shù)的形參及函數(shù)內(nèi)定義
51、的變量稱為局部變量,其作用范圍在定義它的函數(shù)或復(fù)合語句內(nèi)。范圍在定義它的函數(shù)或復(fù)合語句內(nèi)。在函數(shù)外部定義的變量稱為全局變量,其作用域是從定義或在函數(shù)外部定義的變量稱為全局變量,其作用域是從定義或聲明處到整個程序結(jié)束。聲明處到整個程序結(jié)束。7變量的存儲類別指的是變量在計算機(jī)中的存放位置,變變量的存儲類別指的是變量在計算機(jī)中的存放位置,變量的存儲類有:自動類(量的存儲類有:自動類(AUTO)、外部類()、外部類(EXTERN)、)、靜態(tài)類(靜態(tài)類(STATIC)、寄存器類()、寄存器類(REGISTER)。它們具有)。它們具有不同的生存期和作用域。不同的生存期和作用域。 8一個函數(shù)被調(diào)用的過程中可以調(diào)用另一個函數(shù),即函數(shù)一個函數(shù)被調(diào)用的過程中可以調(diào)用另一個函數(shù),即函數(shù)調(diào)用允許嵌套。每一次調(diào)用時,形參的值自動壓入運(yùn)行棧,調(diào)用允許嵌套。每一次
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年司鉆作業(yè)考試題及答案
- 2025年核技術(shù)輻射安全與防護(hù)職業(yè)技能資格知識考試題庫與答案
- 2025年三年英語上冊試題及答案
- 2025年機(jī)械基礎(chǔ)測試題及答案
- 2025年泛微軟件面試題及答案
- 2025年今日消防考試試題及答案
- 2025年數(shù)字命理學(xué)測試題及答案
- 2025年求基期考試題及答案
- 《企業(yè)內(nèi)部控制與制度設(shè)計》期末考試A卷答案
- 2025年黃貞權(quán)文論試題及答案
- 生物工程設(shè)備課件
- 提高團(tuán)隊協(xié)作與溝通技巧
- 2022版高中生物必修二第一章測試題及答案解析
- 《商標(biāo)基礎(chǔ)知識》課件
- 勞動用工協(xié)議書范本正規(guī)范本(通用版)1
- 無職業(yè)病危害承諾書
- 京東集團(tuán)員工手冊-京東
- 正確識記現(xiàn)代漢語常用字字形課件
- 化工機(jī)械安裝維修
- 讀后續(xù)寫微技巧情感描寫
- 2023年《中華人民共和國婦女權(quán)益保障法》知識競賽試題及答案
評論
0/150
提交評論