C語(yǔ)言程序設(shè)計(jì) 課件 第5章 函數(shù)_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì) 課件 第5章 函數(shù)_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì) 課件 第5章 函數(shù)_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì) 課件 第5章 函數(shù)_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì) 課件 第5章 函數(shù)_第5頁(yè)
已閱讀5頁(yè),還剩56頁(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)介

C語(yǔ)言程序設(shè)計(jì)第5章函數(shù)脈絡(luò)導(dǎo)圖C語(yǔ)言程序設(shè)計(jì)技能目標(biāo)C語(yǔ)言程序設(shè)計(jì)(1)能編寫(xiě)和閱讀模塊化結(jié)構(gòu)程序。(2)掌握函數(shù)的定義及調(diào)用方式。(3)掌握局部變量和全局變量的區(qū)別和典型用法。(4)掌握運(yùn)用函數(shù)處理多個(gè)任務(wù)的能力。素質(zhì)目標(biāo)C語(yǔ)言程序設(shè)計(jì)(1)通過(guò)學(xué)習(xí)函數(shù)和模塊化程序設(shè)計(jì)思想,培養(yǎng)學(xué)生在工作、生活中遇到困難時(shí),能夠積極面對(duì),將大問(wèn)題劃分成小問(wèn)題依次去解決。(2)通過(guò)學(xué)習(xí)預(yù)處理程序,使同學(xué)們明白不打無(wú)準(zhǔn)備之仗。現(xiàn)在我們要好好學(xué)習(xí)專(zhuān)業(yè)知識(shí),這樣在工作中才能更好的去完成任務(wù)。(3)通過(guò)程序常見(jiàn)錯(cuò)誤分析與改正,使學(xué)生明白更加美好的人生,需要積累、不斷改正缺點(diǎn)。(4)通過(guò)遞歸函數(shù)的學(xué)習(xí),明白言傳身教的重要性。5.1函數(shù)概述C語(yǔ)言程序設(shè)計(jì)在C語(yǔ)言中可以從不同的角度對(duì)函數(shù)分類(lèi)。1.從函數(shù)定義角度看函數(shù)可分為庫(kù)函數(shù)和用戶定義函數(shù)兩種。2.從對(duì)函數(shù)返回值的需求狀況看C語(yǔ)言函數(shù)又可分為有返回值函數(shù)和無(wú)返回值函數(shù)兩種。3.從主調(diào)函數(shù)和被調(diào)函數(shù)之間數(shù)據(jù)傳送的角度看C語(yǔ)言函數(shù)又可分為無(wú)參函數(shù)和有參函數(shù)。4.從功能角度看main()函數(shù)是主函數(shù),它可以調(diào)用其他函數(shù),而不允許被其他函數(shù)調(diào)用。函數(shù)引入5.1函數(shù)概述C語(yǔ)言程序設(shè)計(jì)函數(shù)的定義一般格式如下:函數(shù)類(lèi)型函數(shù)名(形參及其類(lèi)型){

局部變量定義語(yǔ)句;

可執(zhí)行語(yǔ)句序列;}函數(shù)的定義(1)函數(shù)類(lèi)型函數(shù)返回值的數(shù)據(jù)類(lèi)型,可以是基本數(shù)據(jù)類(lèi)型、void類(lèi)型、指針類(lèi)型等。(2)函數(shù)名是一個(gè)有效、唯一的標(biāo)識(shí)符,符合標(biāo)識(shí)符的命名規(guī)則。(3)形參是實(shí)現(xiàn)函數(shù)功能所要用到的傳輸數(shù)據(jù),它是函數(shù)間進(jìn)行交流通信的唯一途徑。在函數(shù)名后的括號(hào)中定義,形參可以為空,表示沒(méi)有參數(shù),也可以由多個(gè)參數(shù)組成,參數(shù)之間用逗號(hào)隔開(kāi)。(4)函數(shù)體是由{}括起來(lái)的一組復(fù)合語(yǔ)句,一般包含兩部分:聲明部分和執(zhí)行部分。(5)對(duì)于有返回值的函數(shù),返回值的類(lèi)型應(yīng)與函數(shù)類(lèi)型相同。如果return語(yǔ)句中表達(dá)式的值與函數(shù)定義的類(lèi)型不一致,則以函數(shù)定義類(lèi)型為準(zhǔn),并自動(dòng)將return語(yǔ)句中的表達(dá)式的值轉(zhuǎn)換為函數(shù)返回值的類(lèi)型。C語(yǔ)言程序設(shè)計(jì)【例5-1】編寫(xiě)程序,計(jì)算兩個(gè)整數(shù)的差。運(yùn)行結(jié)果語(yǔ)句編寫(xiě)

5.1函數(shù)概述intsubtract(inti,intj)/*自定義函數(shù)subtract*/{ intresult; result=i-j; returnresult;}

程序說(shuō)明:subtract()函數(shù)是用戶自定義函數(shù),函數(shù)類(lèi)型為整型,函數(shù)名為subtract,形參為整型變量i和變量j;函數(shù)體是實(shí)現(xiàn)subtract()函數(shù)功能的語(yǔ)句塊,計(jì)算兩個(gè)整數(shù)的差。C語(yǔ)言程序設(shè)計(jì)【例5-2】不帶參數(shù)的函數(shù)定義,且函數(shù)無(wú)返回值。運(yùn)行結(jié)果語(yǔ)句編寫(xiě)

5.1函數(shù)概述voidprintmsg(){ printf("helloworld");}程序說(shuō)明:printmsg()函數(shù)無(wú)參數(shù),函數(shù)名printmsg前標(biāo)注了void,表示函數(shù)無(wú)返回值,沒(méi)有return語(yǔ)句,因此函數(shù)執(zhí)行完printf語(yǔ)句后自動(dòng)返回。5.1函數(shù)概述C語(yǔ)言程序設(shè)計(jì)C語(yǔ)言是通過(guò)main()函數(shù)來(lái)調(diào)用其他函數(shù),其他函數(shù)之間可相互調(diào)用,但不能調(diào)用main()函數(shù)。函數(shù)被調(diào)用時(shí)獲得程序控制權(quán),調(diào)用完成后,返回到調(diào)用函數(shù)中斷處繼續(xù)運(yùn)行。函數(shù)調(diào)用的一般格式如下:函數(shù)名(實(shí)際參數(shù)列表)按被調(diào)用函數(shù)在main()函數(shù)中出現(xiàn)的位置和完成的功能進(jìn)行劃分,函數(shù)調(diào)用有以下3種方式。(1)把函數(shù)調(diào)用作為一個(gè)語(yǔ)句。例如,printf("sum=%d\n",sum);,以獨(dú)立函數(shù)語(yǔ)句的方式調(diào)用函數(shù)。(2)在表達(dá)式中調(diào)用函數(shù),這種表達(dá)式稱為函數(shù)表達(dá)式。例如,c=4*max(a,b);,是一個(gè)賦值表達(dá)式,把4*max的值賦予變量c。(3)將函數(shù)調(diào)用作為另一個(gè)函數(shù)的實(shí)參。例如,printf("max=%d\n",max(a,b));,把max調(diào)用的返回值又作為printf()函數(shù)的實(shí)參來(lái)使用。函數(shù)的調(diào)用5.1函數(shù)概述C語(yǔ)言程序設(shè)計(jì)名師點(diǎn)睛(1)實(shí)參可以是常量、有確定值得變量或表達(dá)式及函數(shù)調(diào)用。(2)實(shí)參的個(gè)數(shù)必須與形參的個(gè)數(shù)一致。實(shí)參的個(gè)數(shù)多余一個(gè)時(shí),各實(shí)參之間用逗號(hào)隔開(kāi)。(3)若調(diào)用無(wú)參函數(shù),則“實(shí)際參數(shù)列表”可以沒(méi)有,但括號(hào)不能省略。C語(yǔ)言程序設(shè)計(jì)【例5-3】求兩個(gè)實(shí)數(shù)的平均值。運(yùn)行結(jié)果語(yǔ)句編寫(xiě)

5.1函數(shù)概述程序說(shuō)明:平均值函數(shù)average()函數(shù)有兩個(gè)形式參數(shù)x和y,這兩個(gè)參數(shù)用來(lái)接收調(diào)用函數(shù)時(shí)傳遞來(lái)的變量或表達(dá)式的值。main()函數(shù)調(diào)用了四次average()函數(shù),第一次調(diào)用時(shí),用形式參數(shù)x和y接收實(shí)參變量a和變量b的值;第二次調(diào)用時(shí),用表達(dá)式a+b作為實(shí)參之一,將a和a+b的值傳給形參x和y;第三次調(diào)用時(shí),用常量作為實(shí)參,將2.0和4.0的值傳給x和y;第四次調(diào)用時(shí),用函數(shù)調(diào)用average(a,b)作為實(shí)參之一,將c和average(a,b)的值傳給形參x和y。源代碼見(jiàn)教材1.80和2.69的平均值是:2.201.80和4.40的平均值是:3.102.0和4.0的平均值是:3.00平均值是:2.005.1函數(shù)概述C語(yǔ)言程序設(shè)計(jì)函數(shù)原型的聲明就是在函數(shù)定義的基礎(chǔ)上去掉函數(shù)體,后面加上分號(hào)“;”。函數(shù)聲明定義的一般格式如下:函數(shù)類(lèi)型函數(shù)名(形參及其類(lèi)型);例如,intmax(inta,intb);C語(yǔ)言規(guī)定以下3種情況,可以不在主調(diào)函數(shù)中對(duì)被調(diào)函數(shù)進(jìn)行聲明:(1)如果被調(diào)函數(shù)寫(xiě)在主調(diào)函數(shù)的前面,可以不必進(jìn)行聲明。(2)如果函數(shù)的返回值為整型或字符型,可以不必進(jìn)行聲明。(3)如果在所有函數(shù)定義之前,在源程序文件的開(kāi)頭,即在函數(shù)的外部已經(jīng)對(duì)函數(shù)進(jìn)行了聲明,則在各個(gè)調(diào)用函數(shù)中不必再對(duì)所調(diào)用的函數(shù)進(jìn)行聲明。函數(shù)的聲明5.1函數(shù)概述C語(yǔ)言程序設(shè)計(jì)名師點(diǎn)睛(1)變量的聲明通常是對(duì)變量的類(lèi)型和名稱的一種說(shuō)明,不一定會(huì)分配內(nèi)存,而變量的定義肯定會(huì)分配內(nèi)存空間。(2)函數(shù)的聲明是對(duì)函數(shù)的類(lèi)型和名稱的一種說(shuō)明,而函數(shù)的定義是一個(gè)模塊,包括函數(shù)體部分。(3)聲明可能也是定義,也可以不是。廣義上的聲明包括定義性聲明和引用性聲明,通常所說(shuō)的聲明是指后者。C語(yǔ)言程序設(shè)計(jì)【例5-4】求兩個(gè)整數(shù)中較大的值。運(yùn)行結(jié)果語(yǔ)句編寫(xiě)

5.1函數(shù)概述程序說(shuō)明:程序中定義兩個(gè)函數(shù)main()函數(shù)和max()函數(shù)。max()函數(shù)定義變量m,存放兩個(gè)參數(shù)中較大的數(shù),通過(guò)return語(yǔ)句把m的值返回調(diào)用函數(shù)。main()函數(shù)通過(guò)調(diào)用語(yǔ)句:z=max(x,y);求兩個(gè)數(shù)中較大的數(shù)。需要注意子函數(shù)的定義、調(diào)用和子函數(shù)的聲明。源代碼見(jiàn)教材請(qǐng)輸入兩個(gè)整數(shù):183318和33的較大值是33!5.1函數(shù)概述C語(yǔ)言程序設(shè)計(jì)函數(shù)調(diào)用需要向子函數(shù)傳遞數(shù)據(jù),一般是通過(guò)實(shí)參將數(shù)值傳遞給形參。實(shí)參向形參的參數(shù)傳遞有兩種形式:值傳遞和地址傳遞。值傳遞是指單向的數(shù)據(jù)傳遞(將實(shí)參的值賦給形參),傳遞完成后,對(duì)形參的任何操作都不會(huì)影響實(shí)參的值。地址傳遞是指將實(shí)參的地址傳遞給形參,使形參指向的數(shù)據(jù)和實(shí)參指向的數(shù)據(jù)相同,因而被調(diào)函數(shù)的操作會(huì)直接影響實(shí)參指向的數(shù)據(jù)。函數(shù)的參數(shù)傳遞C語(yǔ)言程序設(shè)計(jì)【例5-5】編程實(shí)現(xiàn),比較兩位同學(xué)的品德修養(yǎng)成績(jī),輸出最高的成績(jī)。運(yùn)行結(jié)果語(yǔ)句編寫(xiě)

5.1函數(shù)概述程序說(shuō)明:對(duì)max()函數(shù)調(diào)用時(shí),直接將實(shí)參變量a、變量b和變量c的值傳遞給形參變量i、變量j和變量k。值傳遞是從實(shí)參到形參的單向傳遞。源代碼見(jiàn)教材請(qǐng)輸入兩位同學(xué)的成績(jī):第一位同學(xué)的成績(jī):92第二位同學(xué)的成績(jī):95品德修養(yǎng)成績(jī)較高的是:95C語(yǔ)言程序設(shè)計(jì)【例5-6】函數(shù)值傳遞和地址傳遞。運(yùn)行結(jié)果語(yǔ)句編寫(xiě)

5.1函數(shù)概述程序說(shuō)明:在change()函數(shù)中交換兩個(gè)形參值后輸出這兩個(gè)值,在main()函數(shù)再重新輸出兩個(gè)實(shí)參值,在add()函數(shù)中將數(shù)組作為函數(shù)參數(shù),相當(dāng)于實(shí)參和形參都公用同一個(gè)數(shù)組空間,那么對(duì)形參中每個(gè)數(shù)組元素值的改變,也同樣對(duì)實(shí)參數(shù)組的每個(gè)值改變。在main()函數(shù)中再輸出實(shí)參的數(shù)組每個(gè)元素,數(shù)組元素值都被乘以2。源代碼見(jiàn)教材請(qǐng)輸入兩位同學(xué)的成績(jī):第一位同學(xué)的成績(jī):92第二位同學(xué)的成績(jī):95品德修養(yǎng)成績(jī)較高的是:955.1函數(shù)概述C語(yǔ)言程序設(shè)計(jì)一般情況下,主調(diào)函數(shù)調(diào)用完被調(diào)函數(shù)后,都希望能夠得到一個(gè)確定的值。在C語(yǔ)言中,函數(shù)返回值是通過(guò)return語(yǔ)句來(lái)實(shí)現(xiàn)的。函數(shù)返回值一般格式如下:return(表達(dá)式);return表達(dá)式;return;返回語(yǔ)句和函數(shù)返回值5.1函數(shù)概述C語(yǔ)言程序設(shè)計(jì)名師點(diǎn)睛(1)return語(yǔ)句可使函數(shù)從被調(diào)函數(shù)中退出,返回到調(diào)用它的代碼處,并向調(diào)用函數(shù)返回一個(gè)確定的值。(2)一個(gè)函數(shù)中可以有多個(gè)return語(yǔ)句,執(zhí)行到哪一個(gè)return語(yǔ)句,哪一個(gè)語(yǔ)句就起作用。(3)在定義函數(shù)時(shí)應(yīng)當(dāng)指定函數(shù)的類(lèi)型,并且函數(shù)的類(lèi)型一般應(yīng)與return語(yǔ)句中表達(dá)式的類(lèi)型一致。當(dāng)二者不一致時(shí),應(yīng)一函數(shù)的類(lèi)型為準(zhǔn),即函數(shù)的類(lèi)型絕對(duì)返回值的類(lèi)型。對(duì)于數(shù)值型數(shù)據(jù),可以自動(dòng)進(jìn)行類(lèi)型轉(zhuǎn)換。C語(yǔ)言程序設(shè)計(jì)【例5-7】求兩個(gè)實(shí)數(shù)的和。運(yùn)行結(jié)果語(yǔ)句編寫(xiě)

5.1函數(shù)概述程序說(shuō)明:輸入3.1和2.3,輸出結(jié)果為“3.1+2.3=5.00”,明顯結(jié)果不正確。因?yàn)閍dd()函數(shù)的函數(shù)類(lèi)型為整型、返回值為浮點(diǎn)型,類(lèi)型不一致,返回值k則以函數(shù)定義時(shí)類(lèi)型為主,由系統(tǒng)自動(dòng)將float型轉(zhuǎn)換為int型。源代碼見(jiàn)教材請(qǐng)輸入兩個(gè)實(shí)數(shù):3.12.33.1+2.3=5.005.1函數(shù)概述C語(yǔ)言程序設(shè)計(jì)嵌套調(diào)用是指在調(diào)用一個(gè)函數(shù)并執(zhí)行該函數(shù)過(guò)程中,又調(diào)用另一個(gè)函數(shù)的情況。圖5-2給出了函數(shù)的嵌套調(diào)用示意圖,main()函數(shù)實(shí)現(xiàn)了對(duì)fun1()函數(shù)和fun2()函數(shù)的調(diào)用。由于main()函數(shù)首先調(diào)用fun()1函數(shù),fun1()函數(shù)又對(duì)fun2()函數(shù)進(jìn)行調(diào)用,fun1()函數(shù)中嵌套了fun2()函數(shù)。函數(shù)的嵌套調(diào)用C語(yǔ)言程序設(shè)計(jì)【例5-8】使用函數(shù)的嵌套調(diào)用計(jì)算1!+2!+3!+…+10!的值并輸出。運(yùn)行結(jié)果語(yǔ)句編寫(xiě)

5.1函數(shù)概述程序說(shuō)明:由于要在main()函數(shù)中調(diào)用sum()函數(shù),因此,要對(duì)sum()函數(shù)進(jìn)行聲明。由于要在sum()函數(shù)中調(diào)用fac()函數(shù),因此,要對(duì)fac()函數(shù)進(jìn)行聲明。由于在main()函數(shù)中沒(méi)有直接調(diào)用fac()函數(shù),因此,不必對(duì)fac()函數(shù)進(jìn)行聲明。當(dāng)然,所有函數(shù)的聲明也可以寫(xiě)在main()函數(shù)的前面,這樣就不需要在函數(shù)內(nèi)部進(jìn)行再次聲明。源代碼見(jiàn)教材1!+2!+3!+4!+...+10!=4.09113e+0055.1函數(shù)概述C語(yǔ)言程序設(shè)計(jì)函數(shù)的遞歸調(diào)用是指函數(shù)直接或間接地調(diào)用其本身。遞歸調(diào)用有兩種方式:直接遞歸調(diào)用和間接遞歸調(diào)用。其中,直接遞歸函數(shù)是指在一個(gè)函數(shù)中直接調(diào)用自身。間接遞歸調(diào)用是指在一個(gè)函數(shù)中調(diào)用其他函數(shù),而在其他函數(shù)中又調(diào)用了本函數(shù)。遞歸調(diào)用的過(guò)程分為兩個(gè)階段:遞推和回歸。遞推階段是指從原問(wèn)題出發(fā),按遞歸公式遞推,最終達(dá)到遞歸終止條件,從而將一個(gè)復(fù)雜問(wèn)題分解為一個(gè)相對(duì)簡(jiǎn)單且可以直接求解的子問(wèn)題。回歸階段是指將子問(wèn)題的結(jié)果逐層代入遞歸公式求值,最終求得原問(wèn)題的解。函數(shù)的遞歸調(diào)用C語(yǔ)言程序設(shè)計(jì)【例5-9】用遞歸調(diào)用方法計(jì)算1+2+3+…+n的值。運(yùn)行結(jié)果語(yǔ)句編寫(xiě)

5.1函數(shù)概述源代碼見(jiàn)教材請(qǐng)輸入一個(gè)整數(shù):5s=1+2+3+...+5=155.2變量的作用域與生命期C語(yǔ)言程序設(shè)計(jì)在C語(yǔ)言中,用戶名命名的標(biāo)識(shí)符都有一個(gè)有效的作用域。不同的作用域允許相同的變量和函數(shù)出現(xiàn),同一作用域變量和函數(shù)不能重復(fù)。依據(jù)變量作用域的不同,C語(yǔ)言變量可以分為局部變量和全局變量?jī)纱箢?lèi)。局部變量是指在函數(shù)內(nèi)部或復(fù)合語(yǔ)句內(nèi)部定義的變量。函數(shù)的形參也屬于局部變量。全局變量是指在函數(shù)外部定義的變量。有時(shí)將局部變量稱為內(nèi)部變量,全局變量稱為外部變量。變量的作用域5.2變量的作用域與生命期C語(yǔ)言程序設(shè)計(jì)名師點(diǎn)睛(1)所有函數(shù)都是平行關(guān)系,main()函數(shù)也不例外。main()函數(shù)中定義的變量只在main()函數(shù)中有效,不能使用其他函數(shù)中定義的內(nèi)部變量。(2)不同的函數(shù)內(nèi)可以定義相同名字的內(nèi)部變量,它們互不影響。(3)形參屬于被調(diào)函數(shù)的內(nèi)部變量,實(shí)參屬于主調(diào)函數(shù)的內(nèi)部變量。(4)在同一源文件中,若全局變量與局部變量同名,則在局部變量的作用范圍內(nèi)全局變量不起作用。C語(yǔ)言程序設(shè)計(jì)【例5-10】不同函數(shù)中同名變量。運(yùn)行結(jié)果語(yǔ)句編寫(xiě)

5.2變量的作用域與生命期源代碼見(jiàn)教材main:a=5,b=8sub:a=1,b=7main:a=5,b=85.2變量的作用域與生命期C語(yǔ)言程序設(shè)計(jì)變量的生命期是指變量值在程序運(yùn)行過(guò)程中的存在時(shí)間。C語(yǔ)言變量的生存期分為靜態(tài)生命期和動(dòng)態(tài)生命期。一個(gè)程序占用的內(nèi)存空間通常分為兩個(gè)部分:程序區(qū)和數(shù)據(jù)區(qū),數(shù)據(jù)區(qū)也可以分為靜態(tài)存儲(chǔ)區(qū)和動(dòng)態(tài)存儲(chǔ)區(qū)。靜態(tài)變量是指main()函數(shù)執(zhí)行前就已經(jīng)分配內(nèi)存的變量,其生存期為整個(gè)程序執(zhí)行期;動(dòng)態(tài)變量是在程序執(zhí)行到該變量聲明的作用域才臨時(shí)分配內(nèi)存,其生存期僅在其作用域內(nèi)。生存期和作用域是不同的概念,分別從時(shí)間和空間上對(duì)變量的使用進(jìn)行界定,相互關(guān)聯(lián)又不完全一致。例如,靜態(tài)變量的生存期貫穿整個(gè)程序,但作用域是從聲明位置開(kāi)始到文件結(jié)束。變量的生命期C語(yǔ)言程序設(shè)計(jì)【例5-11】變量作用域。運(yùn)行結(jié)果語(yǔ)句編寫(xiě)

5.2變量的作用域與生命期程序說(shuō)明:(1)全局變量s=30和x=12,但因?yàn)樵趍ain()函數(shù)和程序塊內(nèi)都有同名變量,所以變量x都被屏蔽了。s在函數(shù)外定義完,在main()函數(shù)和各個(gè)子函數(shù)內(nèi)都可以被改變,所以main()函數(shù)被改為15。(2)在main()函數(shù)內(nèi)定義的變量x=5作用域在main內(nèi)部,而程序塊內(nèi)又定義了變量x=1,所以塊內(nèi)的x值為1,直到塊結(jié)束。(3)在塊程序后面重新調(diào)用函數(shù)z=add(x,y);則語(yǔ)句中的x、y值就分別為5和20了。返回值為25,即z=25。源代碼見(jiàn)教材main()函數(shù)初始:s=30,x=5,y=3,z=0程序塊中:s=30,x=1,y=20,z=21main()函數(shù)修改:s=18,x=5,y=20,z=255.2變量的作用域與生命期C語(yǔ)言程序設(shè)計(jì)變量的存儲(chǔ)類(lèi)型有4種,分別由4個(gè)關(guān)鍵字表示:auto(自動(dòng))、register(寄存器)、static(靜態(tài))和extern(外部)。1.auto類(lèi)型自動(dòng)變量是指用auto定義的變量,可默認(rèn)auto。自動(dòng)類(lèi)型變量值是不確定的,如果初始化,則賦初始值操作是在調(diào)用時(shí)進(jìn)行的,且每次調(diào)用都要重新賦初值。2.register類(lèi)型寄存器變量是指用register定義的變量是一種特殊的自動(dòng)變量。這種變量建議編譯程序?qū)⒆兞恐械臄?shù)據(jù)存放在寄存器中,而不像一般的自動(dòng)變量,占用內(nèi)存單元,可以大大提高變量的存取速度。變量的存儲(chǔ)類(lèi)型5.2變量的作用域與生命期C語(yǔ)言程序設(shè)計(jì)3.static類(lèi)型全局變量和局部變量都可以用static來(lái)聲明,但意義不同。全局變量總是靜態(tài)存儲(chǔ),默認(rèn)值為0。局部4.extern類(lèi)型在默認(rèn)情況下,在文件域中用extern聲明(主要不是定義)的變量和函數(shù)都是外部的。但對(duì)于作用域范圍之外的變量和函數(shù),需要使用extern進(jìn)行引用行聲明。變量的存儲(chǔ)類(lèi)型C語(yǔ)言程序設(shè)計(jì)【例5-12】靜態(tài)變量。運(yùn)行結(jié)果語(yǔ)句編寫(xiě)

5.2變量的作用域與生命期程序說(shuō)明:(1)用static定義在函數(shù)內(nèi)部的變量是靜態(tài)局部變量,它們只在函數(shù)第一次被調(diào)用時(shí)賦初值。(2)第一次調(diào)用時(shí),子函數(shù)func()函數(shù)中靜態(tài)變量m初值為0,i初值為2.所以第一次調(diào)用后i的值為0+1+2=3,m的值是3+4+1=8。第二次調(diào)用子函數(shù)時(shí),m初值為8,i初值為3,調(diào)用后i的值為3+8+1=12,m的值為12+4+1=17。所以程序運(yùn)行結(jié)果第一次為8,第二次為17。源代碼見(jiàn)教材第一次調(diào)用子函數(shù)后結(jié)果為8。第二次調(diào)用子函數(shù)后結(jié)果為17。C語(yǔ)言程序設(shè)計(jì)【例5-13】外部變量和外部函數(shù)。運(yùn)行結(jié)果語(yǔ)句編寫(xiě)

5.2變量的作用域與生命期程序說(shuō)明:(1)因?yàn)槭莾蓚€(gè)文件,所以需要在包含main()函數(shù)的文件5-13-1.c中將另一個(gè)源文件5-13-2.c包含到該文件中才能運(yùn)行。包含命令為:#include“5-13-2.c”。而語(yǔ)句externvoidfun();是對(duì)另一個(gè)源文件的fun()函數(shù)進(jìn)行聲明,才能在本文件的main()函數(shù)中使用。(2)對(duì)全局變量a進(jìn)行了聲明,為其重新賦值48,該值也改變了main()函數(shù)中a的值。返回main()函數(shù)中重新輸出a值,發(fā)現(xiàn)a值也變成了48。源代碼見(jiàn)教材main()函數(shù)中a=35fun()函數(shù)中外部全局變量a=48調(diào)用fun()函數(shù)后,main()函數(shù)中a=485.2變量的作用域與生命期C語(yǔ)言程序設(shè)計(jì)1.內(nèi)部函數(shù)內(nèi)部函數(shù)是指一個(gè)函數(shù)只能被它所在文件中的其他函數(shù)調(diào)用。在定義內(nèi)部函數(shù)時(shí),可使用關(guān)static進(jìn)行修飾。一般格式如下:static 類(lèi)型標(biāo)識(shí)符 函數(shù)名(形參列表) {函數(shù)體}例如,static float max(floata,floatb){ …}使用內(nèi)部函數(shù),可以使該函數(shù)只限于它所在的文件,即使其他文件中有同名的函數(shù)也不會(huì)相互干擾,因?yàn)閮?nèi)部函數(shù)不能被其他文件中的函數(shù)所調(diào)用。內(nèi)部函數(shù)和外部函數(shù)5.2變量的作用域與生命期C語(yǔ)言程序設(shè)計(jì)2.外部函數(shù)外部函數(shù)是指在一個(gè)源程序文件中定義的函數(shù)除了可以被本文件中的函數(shù)調(diào)用外,還可以被其他文件中的函數(shù)調(diào)用。在定義外部函數(shù)時(shí),可使用關(guān)鍵字extern進(jìn)行修飾,一般格式如下:extern 類(lèi)型標(biāo)識(shí)符函數(shù)名(形參列表)例如,externchardel_str(charr1){ …}內(nèi)部函數(shù)和外部函數(shù)5.2變量的作用域與生命期C語(yǔ)言程序設(shè)計(jì)名師點(diǎn)睛(1)C語(yǔ)言規(guī)定,若在定義函數(shù)時(shí)省略了extern,則默認(rèn)為外部函數(shù)。本書(shū)前面所用的函數(shù)都是外部函數(shù)。(2)在調(diào)用函數(shù)的文件中,一般要用extern聲明所用的函數(shù)是外部函數(shù),表示該函數(shù)是在其他文件中定義的外部函數(shù)。5.3預(yù)處理程序C語(yǔ)言程序設(shè)計(jì)1.不帶參數(shù)的宏定義不帶參數(shù)的宏定義也稱為字符串的宏定義,它用來(lái)指定一個(gè)標(biāo)識(shí)符代表一個(gè)字符串常量。一般格式如下:#define 標(biāo)識(shí)符 字符串其中:標(biāo)識(shí)符就是宏的名字,簡(jiǎn)稱宏,字符串是宏的替換正文,通過(guò)宏定義,使得標(biāo)識(shí)符等同于字符串。例如,define PI3.14其中,PI是宏名,字符串3.14是替換正文。預(yù)處理程序?qū)⒊绦蛑幸訮I作為標(biāo)識(shí)符出現(xiàn)的地方都用3.14替換,這種替換稱為宏替換或宏擴(kuò)展。這種替換的優(yōu)點(diǎn)在于,用一個(gè)有意義的標(biāo)識(shí)符代替一個(gè)字符串,便于記憶,易于修改,提高了程序的可移植性。宏定義5.3預(yù)處理程序C語(yǔ)言程序設(shè)計(jì)名師點(diǎn)睛(1)若要改變出來(lái)數(shù)的內(nèi)容,只需要修改宏定義中N的替換字符串即可,不需要修改其他地方。(2)宏定義在源程序中要單獨(dú)占一行,通常“#”出現(xiàn)在一行的第一個(gè)字符的位置,允許#號(hào)前有若干的空格或制表符,但不允許有其他字符。(3)每個(gè)宏定義以換行符作為結(jié)束的標(biāo)志,這與C語(yǔ)言的語(yǔ)句不同,不以“;”作為結(jié)束,如果使用了分號(hào),則會(huì)將分號(hào)作為字符串的一部分一起替換。(4)宏的名字用大小寫(xiě)字母均可以作為標(biāo)識(shí)符,為了與程序中的變量名或函數(shù)名相區(qū)別和醒目,習(xí)慣用大寫(xiě)字母作為宏名。宏名是一個(gè)常量的標(biāo)識(shí)符,它不是變量,不能對(duì)它進(jìn)行賦值。(5)一個(gè)宏的作用域是從定義的地方開(kāi)始到本文件結(jié)束。(6)宏定義可以嵌套。例如,#define PI 3.14 #define TWOPI (2.0*PI)若有語(yǔ)句s=TWOPI*r*r;,則在編譯時(shí)被替換為s=(2.0*PI)*r*r;。5.3預(yù)處理程序C語(yǔ)言程序設(shè)計(jì)2.帶參數(shù)的宏定義C語(yǔ)言的預(yù)處理命令允許使用帶參數(shù)的宏,帶參數(shù)的宏在展開(kāi)時(shí),不是進(jìn)行簡(jiǎn)單的字符串替換,而是進(jìn)行參數(shù)替換。帶參數(shù)的宏定義一般形式如下:#define 標(biāo)識(shí)符(參數(shù)表) 字符串例如,#define SUM(a,b)(a+b) 其中,SUM是宏名,a和b是函數(shù)形式參數(shù),(a+b)是計(jì)算兩個(gè)參數(shù)之和的表達(dá)式。宏定義C語(yǔ)言程序設(shè)計(jì)【例5-15】帶參數(shù)的宏定義,求兩個(gè)數(shù)的和。運(yùn)行結(jié)果語(yǔ)句編寫(xiě)

5.3預(yù)處理程序#include<stdio.h>#defineSUM(a,b)(a+b)intmain(){ printf("兩數(shù)之和為:%d",SUM(3,5));}程序說(shuō)明:有參數(shù)的宏并不是將3和5的值傳遞給a和b進(jìn)行求和,而是將“sum(3,5)”替換為“(3+5)”,得出兩數(shù)之和為8。兩數(shù)之和為:85.3預(yù)處理程序C語(yǔ)言程序設(shè)計(jì)名師點(diǎn)睛(1)在宏定義中宏名和左括號(hào)之間沒(méi)有空格。(2)帶參數(shù)的宏展開(kāi)時(shí),用實(shí)參字符串替換形參字符串,可能會(huì)發(fā)生錯(cuò)誤。比較好的方法是將宏的各個(gè)參數(shù)用小括號(hào)括起來(lái)。(3)帶參數(shù)的宏調(diào)用和函數(shù)調(diào)用非常相似,但他們畢竟不是一回事。其主要區(qū)別在于:帶參數(shù)的宏替換只是簡(jiǎn)單的字符串替換,不存在函數(shù)類(lèi)型、返回值及參數(shù)類(lèi)型的問(wèn)題;函數(shù)調(diào)用時(shí),先計(jì)算實(shí)參表達(dá)式的值,再將它的值傳遞給形參,在傳遞過(guò)程中,要檢查實(shí)參和形參的數(shù)據(jù)類(lèi)型是否一致。而帶參數(shù)的宏替換是用實(shí)參表達(dá)式原封不動(dòng)地替換形參,并不進(jìn)行計(jì)算,也不檢查參數(shù)類(lèi)型的一致性。5.3預(yù)處理程序C語(yǔ)言程序設(shè)計(jì)“文件包含”是指把指定文件的全部?jī)?nèi)容包含到本文件中。文件包含控制行的一般形式如下:#include "文件名"或#include<文件名>例如,#include <stdio.h>在編譯預(yù)處理時(shí),就把stdio.h頭文件的內(nèi)容與當(dāng)前的文件連在一起進(jìn)行編譯。同樣此命令對(duì)用戶自己編寫(xiě)的文件也適用。使用文件包含命令的優(yōu)點(diǎn):在程序設(shè)計(jì)中常常把一些公用性符號(hào)常量、宏、變量和函數(shù)的說(shuō)明等集中起來(lái)組成若干文件,使用時(shí)可以根據(jù)需要將相關(guān)文件包含進(jìn)來(lái),這樣可以避免在多個(gè)文件中輸入相同的內(nèi)容,也為程序的可移植性、可修改性提供了良好的條件。文件包含C語(yǔ)言程序設(shè)計(jì)【例5-16】利用編譯預(yù)處理命令實(shí)現(xiàn)多個(gè)文件的編譯和連接。運(yùn)行結(jié)果語(yǔ)句編寫(xiě)

5.3預(yù)處理程序程序說(shuō)明:文件5-16-2.c中的sum()函數(shù)和文件5-16-3.c中的mul()函數(shù)都被包含到文件5-16-1.c中,如同文件5-16-1.c中定義了這兩個(gè)函數(shù)一樣,所以說(shuō)文件包含處理也都是模塊化程序設(shè)計(jì)的一種手段。源代碼見(jiàn)教材a,b,c=?2,3,4Thesumis9Themulis245.3預(yù)處理程序C語(yǔ)言程序設(shè)計(jì)名師點(diǎn)睛(1)一個(gè)include命令只能指定一個(gè)被包含文件,若要包含n個(gè)文件,則需要用n個(gè)include命令。(2)文件包含控制行可出現(xiàn)在源文件的任何地方,但為了醒目,大多放在文件的開(kāi)頭部分。(3)#include命令的文件名,使用雙引號(hào)和尖括號(hào)是有區(qū)別的:使用尖括號(hào)僅在系統(tǒng)指定的“標(biāo)準(zhǔn)”目錄中查找文件,而不在源文件的目錄中查找;使用雙引號(hào)表明先在正在處理的源文件目錄中搜索指定的文件,若沒(méi)有,再到系統(tǒng)指定的“標(biāo)準(zhǔn)”目錄中查找。所以使用系統(tǒng)提供的文件時(shí),一般使用尖括號(hào),以節(jié)省查找時(shí)間;若包含用戶自己編寫(xiě)的文件(這些文件一般在當(dāng)前目錄中),使用雙引號(hào)比較好。(4)文件包含命令可以是嵌套的,在一個(gè)被包含的文件中還可以包含有其他的文件。5.3預(yù)處理程序C語(yǔ)言程序設(shè)計(jì)一般情況下,源程序中所有的行都參加編譯。但是有時(shí)希望對(duì)其中一部分內(nèi)容只在滿足一定條件時(shí)才進(jìn)行編譯,也就是對(duì)一部分內(nèi)容指定編譯條件,這就是“條件編譯”。(1)使用#ifdef的形式。#ifdef 標(biāo)識(shí)符 程序段1#esle

程序段2#endif此語(yǔ)句的作用是當(dāng)標(biāo)識(shí)符已經(jīng)被#define命令所定義時(shí),條件為真,編譯程序段1;否則條件為假,編譯程序段2。它與選擇結(jié)構(gòu)的if語(yǔ)句類(lèi)似,else語(yǔ)句也可以沒(méi)有。條件編譯5.3預(yù)處理程序C語(yǔ)言程序設(shè)計(jì)(2)使用#ifndef的形式。#ifndef 標(biāo)識(shí)符 程序段1#else

程序段2#endif此語(yǔ)句的作用是當(dāng)標(biāo)識(shí)符未被#define命令所定義時(shí),條件為真,編譯程序段1;否則條件為假,編譯程序段2。與上面的條件編譯類(lèi)似,else語(yǔ)句也可以沒(méi)有。條件編譯(3)使用#if的形式。#if 表達(dá)式

程序段1#else

程序段2#endif它的作用與if-else語(yǔ)句類(lèi)似,當(dāng)表達(dá)式的值為非0時(shí),條件為真,編譯表達(dá)式后的程序段1,否則條件為假,編譯程序段2。C語(yǔ)言程序設(shè)計(jì)【例5-18】根據(jù)需要設(shè)置條件編譯,將字母全改為大寫(xiě)輸出或全改為小寫(xiě)輸出。運(yùn)行結(jié)果語(yǔ)句編寫(xiě)

5.3預(yù)處理程序程序說(shuō)明:在程序中,LETTER通過(guò)宏定義值為1(非0),則在編譯時(shí)對(duì)第一個(gè)if語(yǔ)句進(jìn)行編譯,即選擇將小寫(xiě)字母轉(zhuǎn)換為大寫(xiě)字母。源代碼見(jiàn)教材Stringis:ILovemycountryChinaChangeStringis:ILOVEMYCOUNTRYCHINA5.3預(yù)處理程序C語(yǔ)言程序設(shè)計(jì)名師點(diǎn)睛事實(shí)上條件編譯可以用if語(yǔ)句代替,但使用if語(yǔ)句目標(biāo)代碼比較長(zhǎng),因?yàn)樗械恼Z(yǔ)句均要參與編譯;而使用條件編譯,只有一部分參與編譯,且編譯后的目標(biāo)代碼比較短,所以很多地方使用條件編譯。5.3預(yù)處理程序C語(yǔ)言程序設(shè)計(jì)編譯預(yù)處理程序可以識(shí)別一些特殊的符號(hào),并對(duì)于在源程序中出現(xiàn)的這些符號(hào)將用于合適的值進(jìn)行替換,從而可以實(shí)現(xiàn)某種程度上的編譯控制。常見(jiàn)的定義好的供編譯預(yù)處理程序識(shí)別和處理的特殊符號(hào)如下所示(不同的編譯器還可以定義自己的特殊函數(shù)的符號(hào))。_FILE_:包含當(dāng)前程序文件名的字符串。_LINE_:表示當(dāng)前行號(hào)的整數(shù)。_DATE_:包含當(dāng)前日期的字符串。_STDC_:若編譯器遵循ANSIC標(biāo)準(zhǔn),則它是個(gè)非0值。_TIME_:包含當(dāng)前時(shí)間的字符串。特殊符號(hào)處理5.3預(yù)處理程序C語(yǔ)言程序設(shè)計(jì)名師點(diǎn)睛符號(hào)中都是雙下畫(huà)線,而不是單下畫(huà)線,并且日期和時(shí)間都是一個(gè)從特定的時(shí)間起點(diǎn)開(kāi)始的長(zhǎng)整數(shù),并不是通常熟悉的年月日時(shí)分秒格式。C語(yǔ)言程序設(shè)計(jì)【例5-19】編譯預(yù)處理中特殊符號(hào)的顯示。運(yùn)行結(jié)果語(yǔ)句編寫(xiě)

5.3預(yù)處理程序源代碼見(jiàn)教材4main13:05:02Jul42022C:\user\5-19.c1C語(yǔ)言程序設(shè)計(jì)【例5-20】演示#line的用法。運(yùn)行結(jié)果語(yǔ)句編寫(xiě)

5.3預(yù)處理程序本行為第10行!#line7 /*初始化行計(jì)數(shù)器*/#include<stdio.h>intmain(){ printf("本行為第%d行!\n",__LINE__);}5.3預(yù)處理程序C語(yǔ)言程序設(shè)計(jì)名師點(diǎn)睛

溫馨提示

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