




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
函數(shù)4.1概述4.2函數(shù)的定義、調(diào)用和聲明4.3函數(shù)的嵌套和遞歸調(diào)用4.4變量的作用域與生存期4.5編譯預(yù)處理命令本章小結(jié)
本章要點(diǎn)
函數(shù)是指完成一個(gè)特定工作的獨(dú)立程序模塊,它是C語(yǔ)言程序的基本組成單元。每一個(gè)C語(yǔ)言程序都是由一個(gè)或者一個(gè)以上的函數(shù)組成的,如每個(gè)程序必須包括的main()函數(shù)。函數(shù)可以把大的計(jì)算任務(wù)分解成若干個(gè)較小的任務(wù),使編程更為簡(jiǎn)單。本章詳細(xì)講解C語(yǔ)言程序設(shè)計(jì)中函數(shù)的相關(guān)知識(shí)。
本章主要內(nèi)容包括函數(shù)的定義和聲明;函數(shù)的調(diào)用和參數(shù)傳遞;函數(shù)的嵌套調(diào)用和遞歸調(diào)用;變量的作用域和生存期;變量的存儲(chǔ)類別;編譯預(yù)處理。
4.1概述
4.1.1函數(shù)的分類C語(yǔ)言程序是由函數(shù)組成的,程序員可以直接調(diào)用系統(tǒng)定義好的函數(shù),也可以自己定義函數(shù),進(jìn)行調(diào)用
從用戶使用的角度看,函數(shù)分為兩種:
(1)標(biāo)準(zhǔn)函數(shù):即庫(kù)函數(shù)。我們前面用過(guò)的函數(shù)除了每個(gè)程序必須有的main()函數(shù)以外,還有格式輸出函數(shù)printf(),格式輸入函數(shù)scanf(),求平方根函數(shù)sqrt()等,這些函數(shù)不需要用戶編寫,可以直接調(diào)用。這些由C語(yǔ)言系統(tǒng)提供定義的函數(shù)叫庫(kù)函數(shù)。
(2)自定義函數(shù):用戶也可以根據(jù)程序需要自己定義新的函數(shù)。這些由用戶自己定義的函數(shù)叫自定義函數(shù)。本章重點(diǎn)講述的就是自定義函數(shù)的定義和調(diào)用。
根據(jù)函數(shù)的調(diào)用關(guān)系,可以把函數(shù)分為兩種:
(1)主調(diào)函數(shù):調(diào)用其他函數(shù)的函數(shù)。
(2)被調(diào)函數(shù):被其他函數(shù)調(diào)用的函數(shù)。
從函數(shù)的形式看,函數(shù)分兩類:
(1)無(wú)參函數(shù):在調(diào)用函數(shù)時(shí),主調(diào)函數(shù)不需要復(fù)制數(shù)據(jù)到被調(diào)函數(shù),一般用來(lái)執(zhí)行特定的操作。
(2)有參函數(shù):在調(diào)用函數(shù)時(shí),主調(diào)函數(shù)和被調(diào)函數(shù)需要進(jìn)行數(shù)據(jù)傳遞。
4.1.2程序解析
【例4-1】輸入n,求1!+2!+…+n!,并輸出結(jié)果。
分析:我們可以先不計(jì)算階乘,把i!?作為一個(gè)累加項(xiàng),這樣程序編寫就非常簡(jiǎn)單了。通過(guò)上一章的學(xué)習(xí),我們可以通過(guò)一個(gè)for循環(huán)來(lái)計(jì)算累加和,程序可寫為
問(wèn)題:i!?怎么求?
方法:可以通過(guò)兩種方法來(lái)對(duì)i!?進(jìn)行求解。
(1)可以使用循環(huán)來(lái)求i!,即在主函數(shù)中使用循環(huán)或者二重循環(huán)來(lái)求i!(代碼請(qǐng)讀者自己編寫)。
(2)也可以編寫階乘函數(shù),在主函數(shù)中調(diào)用階乘函數(shù)求出i!,使程序更為簡(jiǎn)單。首先要定義階乘函數(shù)intfactorial(intm),然后用函數(shù)調(diào)用代替上述代碼中的“i!”。
程序分析:輸入3后,程序中n賦值為3,則main()函數(shù)中,for循環(huán)執(zhí)行3次,每次執(zhí)行調(diào)用一次factorial()函數(shù)計(jì)算i!并保存在變量f中,計(jì)算完成后由returnf;語(yǔ)句帶回到main()函數(shù)中,將i!值累加到變量sum上。經(jīng)過(guò)3次循環(huán)后,就可以計(jì)算出sum=1!+2!+3!,并將sum輸出。
說(shuō)明:
(1)一個(gè)簡(jiǎn)單的C程序可由一個(gè)main()函數(shù)組成。
(2)一般來(lái)說(shuō),一個(gè)C語(yǔ)言程序由一個(gè)main()函數(shù)和若干個(gè)用戶定義的函數(shù)組成。
(3)程序執(zhí)行時(shí),從main()函數(shù)開(kāi)始,通過(guò)主函數(shù)調(diào)用其他函數(shù)。其他函數(shù)執(zhí)行結(jié)束后,還要回到main()函數(shù),在main()函數(shù)中結(jié)束整個(gè)程序的運(yùn)行。main()函數(shù)是系統(tǒng)定義的程序的入口點(diǎn)。注意:一個(gè)C語(yǔ)言程序只能有一個(gè)main()函數(shù)。
(4)用戶自定義函數(shù)可以相互調(diào)用,但其他函數(shù)不能調(diào)用main()函數(shù)。
4.2函數(shù)的定義、調(diào)用和聲明
對(duì)用戶自定義函數(shù)的使用主要分為三個(gè)步驟:首先要定義函數(shù),即編寫函數(shù)的主體,實(shí)現(xiàn)函數(shù)的功能;定義完函數(shù)以后,在?main()函數(shù)或其他函數(shù)中調(diào)用這個(gè)函數(shù)執(zhí)行相應(yīng)計(jì)算或?qū)崿F(xiàn)特定的功能;如果被調(diào)函數(shù)在主調(diào)函數(shù)之后,則調(diào)用之前還要對(duì)函數(shù)進(jìn)行聲明。
4.2.1函數(shù)的定義
1.函數(shù)定義的一般形式
函數(shù)定義的一般形式如下:
函數(shù)類型函數(shù)名(形參表) /*函數(shù)首部*/
{ /*函數(shù)體*/
聲明部分
執(zhí)行部分
return語(yǔ)句
}
說(shuō)明:
(1)函數(shù)類型指函數(shù)返回值類型,應(yīng)與return語(yǔ)句中表達(dá)式的類型一致。當(dāng)兩者不一致時(shí),以函數(shù)類型為準(zhǔn)。若函數(shù)不需要返回值,函數(shù)類型為void,函數(shù)體中不需要寫return語(yǔ)句。
(2)函數(shù)類型默認(rèn)為int型,即當(dāng)函數(shù)類型不寫時(shí),返回值類型為int型,而不是沒(méi)有返回值,請(qǐng)注意區(qū)分。
(3)形參表中格式為
類型1參數(shù)1,類型2參數(shù)2,…,類型n參數(shù)n
參數(shù)之間用逗號(hào)分隔,每個(gè)參數(shù)前面的類型都必須分別寫明。
(4)?return語(yǔ)句只能返回一個(gè)值。
(5)注意函數(shù)首部后面不能加分號(hào)。
【例4-2】編寫函數(shù)fun,統(tǒng)計(jì)一個(gè)十進(jìn)制數(shù)中數(shù)碼為0的個(gè)數(shù),以及數(shù)碼為1的個(gè)數(shù)。
程序分析:fun()函數(shù)中每次循環(huán)判斷最低位是否為0或1,是的話,計(jì)數(shù)變量+1,然后將已經(jīng)判斷完的最低位去掉,直到判斷完所有的位數(shù)。fun()函數(shù)的計(jì)算結(jié)果在函數(shù)體中輸出,結(jié)果不需要帶回main()函數(shù),函數(shù)沒(méi)有返回值。
2.無(wú)參函數(shù)的定義
無(wú)參函數(shù)定義的一般形式如下:
函數(shù)類型函數(shù)名() /*函數(shù)首部*/
{
聲明部分
執(zhí)行部分 /*函數(shù)體*/
return語(yǔ)句
}
無(wú)參函數(shù)其實(shí)就是函數(shù)的一種特殊情況。在使用函數(shù)的過(guò)程中,有時(shí)主調(diào)函數(shù)不需要傳遞值給被調(diào)函數(shù),這時(shí)函數(shù)定義時(shí)就沒(méi)有參數(shù)。無(wú)參函數(shù)可以帶回返回值,也可以不帶回返回值,但無(wú)參函數(shù)一般用于完成特定操作,很少用于計(jì)算,所以大部分情況下也沒(méi)有返回值。
【例4-3】一個(gè)簡(jiǎn)單的無(wú)參函數(shù)例題。
程序分析:這是一個(gè)最簡(jiǎn)單的函數(shù)調(diào)用程序,其中printstar()是一個(gè)無(wú)參函數(shù),函數(shù)的功能是打印一行12個(gè)“*”號(hào)并換行。printstar()函數(shù)體只有一條語(yǔ)句,執(zhí)行打印操作,不需要從主函數(shù)中傳遞參數(shù),也不需要帶回返回值,所以函數(shù)中沒(méi)有return語(yǔ)句,且函數(shù)類型為void。
在main()函數(shù)中,調(diào)用兩次printstar()函數(shù),在“HelloWorld!”前后各打印一行星號(hào)。
3.空函數(shù)的定義
空函數(shù)定義的一般形式如下:
函數(shù)類型函數(shù)名()
{ }
說(shuō)明:空函數(shù)什么工作也不做,沒(méi)有任何實(shí)際作用。在編寫程序的開(kāi)始階段,可以在以后需要擴(kuò)充功能的地方寫上空函數(shù),在編寫程序的后期,再用完整的函數(shù)替代它。
4.2.2函數(shù)的調(diào)用
定義一個(gè)函數(shù)后,就可以在程序中調(diào)用這個(gè)函數(shù)。調(diào)用庫(kù)函數(shù)時(shí),要在程序開(kāi)頭加上#include命令包含相應(yīng)的頭文件,否則編譯會(huì)出現(xiàn)錯(cuò)誤:函數(shù)未定義。調(diào)用自定義函數(shù)時(shí),程序中必須包括函數(shù)的定義,如果函數(shù)定義在調(diào)用的后面,則需要在調(diào)用前加上函數(shù)的聲明。
1.函數(shù)調(diào)用的一般格式
函數(shù)調(diào)用的一般格式如下:
函數(shù)名(實(shí)際參數(shù)表)
說(shuō)明:
(1)函數(shù)調(diào)用和函數(shù)定義的區(qū)別。函數(shù)調(diào)用時(shí),實(shí)參列表不需要參數(shù)類型,實(shí)際參數(shù)可以是簡(jiǎn)單變量,也可以是常量;而在函數(shù)定義時(shí),參數(shù)類型一定不能省略。
(2)庫(kù)函數(shù)調(diào)用和用戶自定義函數(shù)調(diào)用的格式是一樣的。
(3)如果函數(shù)有返回值,則在遇到return時(shí),返回到調(diào)用的地方,并帶回結(jié)果;如果函數(shù)沒(méi)有返回值,則在遇到函數(shù)體的后一半花括號(hào)時(shí),返回到調(diào)用的地方。
2.函數(shù)調(diào)用流程
系統(tǒng)對(duì)函數(shù)的調(diào)用有如下的流程:
(1)程序從main()函數(shù)開(kāi)始執(zhí)行,當(dāng)遇到函數(shù)調(diào)用時(shí),為被調(diào)函數(shù)分配存儲(chǔ)空間,將實(shí)參值復(fù)制給形參變量。
(2)主函數(shù)暫停執(zhí)行,轉(zhuǎn)而執(zhí)行被調(diào)用的函數(shù)。
(3)被調(diào)函數(shù)執(zhí)行完成后(遇到return語(yǔ)句或函數(shù)的右邊花括號(hào)),返回主函數(shù),釋放被調(diào)函數(shù)占用的內(nèi)存空間,從主函數(shù)原先暫停的位置繼續(xù)執(zhí)行。
函數(shù)調(diào)用流程如圖4-1所示。圖4-1函數(shù)調(diào)用流程示意圖
【例4-4】輸入兩個(gè)整數(shù),調(diào)用最大值函數(shù)計(jì)算兩數(shù)的最大值,并輸出。
如果輸入3和5,運(yùn)行結(jié)果為
Enteraandb:35
maxofaandbis5
程序分析:程序功能為輸入兩個(gè)整數(shù),調(diào)用max()函數(shù)計(jì)算兩數(shù)最大值,并打印輸出。main()函數(shù)中首先調(diào)用scanf()函數(shù)輸入變量a和b,然后在printf("maxofaandbis%d\n",max(a,b));語(yǔ)句中調(diào)用max()。此時(shí),函數(shù)跳轉(zhuǎn)到max()函數(shù),在max()函數(shù)中,使用if-else語(yǔ)句計(jì)算a和b中較大的數(shù),并賦給變量c。最后returnc;語(yǔ)句將最大值帶回到main()函數(shù)中,替換printf()函數(shù)中的max(a,b),并將最大值打印輸出。
3.函數(shù)調(diào)用方式
函數(shù)調(diào)用作為一個(gè)單獨(dú)的語(yǔ)句,通常用在不需要返回值,只執(zhí)行特定操作的函數(shù)調(diào)用中,如printstar();。
如果函數(shù)需要帶回返回值,則可以采用下面兩種調(diào)用方式:
(1)函數(shù)作為一個(gè)表達(dá)式的一部分,如sum=sum+factorial(i);。
(2)函數(shù)作為其他函數(shù)的參數(shù),如printf("maxofaandbis%d\n",max(a,b));。
在編寫程序的過(guò)程中,可以根據(jù)個(gè)人習(xí)慣和程序的需要,選擇適當(dāng)?shù)恼{(diào)用方式。
【例4-5】編寫函數(shù)isprime()判斷一個(gè)數(shù)是否為素?cái)?shù),并在main()函數(shù)中調(diào)用,求20到100所有素?cái)?shù)。
運(yùn)行結(jié)果如圖4-2所示。圖4-2例4-5運(yùn)行結(jié)果
4.2.3函數(shù)的聲明
C語(yǔ)言要求函數(shù)要先定義后調(diào)用,即被調(diào)函數(shù)要放在主調(diào)函數(shù)之前,就像變量要先定義后使用一樣。如果自定義函數(shù)放在主調(diào)函數(shù)之后,就需要在函數(shù)調(diào)用前加上函數(shù)聲明。如果函數(shù)調(diào)用之前,既不定義,也不聲明,程序編譯時(shí)會(huì)出現(xiàn)錯(cuò)誤:函數(shù)未定義。
函數(shù)聲明的一般格式為
函數(shù)類型函數(shù)名(形參表);
即只寫函數(shù)定義中的函數(shù)首部,并以分號(hào)結(jié)束。
【例4-6】一個(gè)盒子里有3個(gè)紅球(x),5個(gè)白球(y),6個(gè)黑球(z),從中任意取出6個(gè),保證里面一定有紅球和白球。請(qǐng)編寫函數(shù),輸出所有的方案。
運(yùn)行結(jié)果如圖4-3所示。圖4-3例4-6運(yùn)行結(jié)果
4.2.4函數(shù)間的參數(shù)傳遞
函數(shù)的參數(shù)分為兩種:形式參數(shù)和實(shí)際參數(shù),簡(jiǎn)稱為形參和實(shí)參。在定義和聲明中,函數(shù)參數(shù)只有變量類型和變量名,是形式參數(shù);而在函數(shù)調(diào)用中,函數(shù)的參數(shù)可以是常量或者是簡(jiǎn)單變量,是實(shí)際參數(shù)。
函數(shù)調(diào)用語(yǔ)句中的實(shí)參類型個(gè)數(shù)和順序必須與函數(shù)定義中的形參類型和個(gè)數(shù)一致,否則編譯時(shí)會(huì)發(fā)生“類型不匹配”的錯(cuò)誤。
【例4-7】輸入x和a,調(diào)用mypow()函數(shù)計(jì)算xa,并輸出結(jié)果。
程序分析:在主函數(shù)的函數(shù)調(diào)用語(yǔ)句y=mypow(x,a);中,x和a為實(shí)際參數(shù),而在函數(shù)定義和聲明doublemypow(doublex1,inta1)中,x和a為形式參數(shù)。
參數(shù)傳遞過(guò)程:在main()函數(shù)中執(zhí)行函數(shù)調(diào)用語(yǔ)句y=mypow(x,a);時(shí),x和a的值會(huì)復(fù)制給x1和a1。在mypow()函數(shù)中,經(jīng)過(guò)計(jì)算得到結(jié)果10.24,通過(guò)return語(yǔ)句帶回到y(tǒng)=mypow(x,a);語(yǔ)句中,替換mypow(x,a)。參數(shù)傳遞過(guò)程如圖4-4所示。圖4-4參數(shù)傳遞過(guò)程
【例4-8】猜數(shù)游戲:計(jì)算機(jī)產(chǎn)生一個(gè)1~1000之間的隨機(jī)整數(shù),用戶輸入一個(gè)正整數(shù),判斷是否與計(jì)算機(jī)產(chǎn)生的隨機(jī)數(shù)相同。若猜中,輸出所猜次數(shù)和該數(shù);若沒(méi)猜中,輸出“Sorry,youarefailed!”。用戶一共有10次猜數(shù)的機(jī)會(huì)。
編寫函數(shù)intGuess(intn)完成猜數(shù)功能:參數(shù)n是計(jì)算機(jī)產(chǎn)生的隨機(jī)數(shù),用戶輸入一個(gè)所猜的正整數(shù)x,判斷是否與n相等。若x與n相等,返回所猜次數(shù);若x比n小,輸出“toosmall!”;若x比n大,輸出“toobig!”。沒(méi)猜中可以繼續(xù),但最多可猜10次,若10次都沒(méi)猜中,則返回0。
【例4-9】一個(gè)參數(shù)單向值傳遞的例子。
運(yùn)行結(jié)果:
Beforefun1,a=5
Afterfun1,a=5
請(qǐng)思考為什么運(yùn)行結(jié)果不是:
Beforefun1,a=5
Afterfun1,a=10
程序分析:main()函數(shù)在調(diào)用fun1()函數(shù)時(shí),會(huì)為fun1()中的參數(shù)和變量重新分配存儲(chǔ)空間。雖然函數(shù)調(diào)用fun1(a)中的實(shí)參和函數(shù)定義voidfun1(inta)中的形參同類型,而且同名,但并不是同一個(gè)變量。在fun1()函數(shù)中,a=10;語(yǔ)句修改的是形參a,而參數(shù)傳遞是單向的,所以修改不會(huì)傳遞到main()函數(shù)中去,main()函數(shù)中實(shí)參a的值仍然是5,而不是10。
fun1()函數(shù)參數(shù)傳遞的過(guò)程如圖4-5所示。
圖4-5例4-9中參數(shù)傳遞過(guò)程
【例4-10】輸入兩個(gè)整數(shù),調(diào)用swap函數(shù)將兩數(shù)交換。
4.3函數(shù)的嵌套和遞歸調(diào)用
4.3.1函數(shù)的嵌套調(diào)用C語(yǔ)言不允許函數(shù)的嵌套定義,但允許函數(shù)的嵌套調(diào)用。如果函數(shù)A調(diào)用函數(shù)B,而函數(shù)B又調(diào)用函數(shù)C,這樣的調(diào)用方式就叫函數(shù)的嵌套調(diào)用。
下面舉一個(gè)兩層嵌套的例子。在main()函數(shù)中調(diào)用f1()函數(shù),而在f1()函數(shù)中又調(diào)用f2()函數(shù),這樣就形成了兩層的嵌套調(diào)用。當(dāng)函數(shù)f2()執(zhí)行完成后會(huì)返回函數(shù)f1(),從調(diào)用的地方繼續(xù)執(zhí)行,直到函數(shù)f1()執(zhí)行結(jié)束,返回main()函數(shù),然后從調(diào)用函數(shù)f1()的地方往后執(zhí)行,最后在main()函數(shù)中程序運(yùn)行結(jié)束。函數(shù)嵌套調(diào)用過(guò)程如圖4-6所示。圖4-6函數(shù)嵌套調(diào)用示意圖
【例4-11】編程:從鍵盤輸入兩個(gè)整數(shù)a和b,調(diào)用兩函數(shù)分別求a和b的最大公約數(shù)、最小公倍數(shù),并輸出結(jié)果。
程序分析:求最大公約數(shù)采用輾轉(zhuǎn)相除法,而最小公倍數(shù)為m*n/最大公約數(shù),在求最小公倍數(shù)時(shí),要嵌套調(diào)用最大公約數(shù)函數(shù)。
4.3.2遞歸函數(shù)
在調(diào)用一個(gè)函數(shù)的過(guò)程中,會(huì)出現(xiàn)直接或間接地調(diào)用函數(shù)本身的情況,稱為函數(shù)的遞歸調(diào)用。簡(jiǎn)而言之,遞歸就是函數(shù)自己調(diào)用自己。
遞歸可分為直接遞歸和間接遞歸。函數(shù)直接調(diào)用本身叫直接遞歸;而函數(shù)A調(diào)用函數(shù)B,在函數(shù)B中又調(diào)用函數(shù)A,這種函數(shù)間接調(diào)用本身的函數(shù)調(diào)用叫間接遞歸。
【例4-12】編程:從鍵盤輸入一個(gè)正整數(shù)n,逐個(gè)打印輸出1!~n!。要求使用遞歸函數(shù)實(shí)現(xiàn)階乘的計(jì)算。
程序分析:階乘函數(shù)的遞歸調(diào)用過(guò)程如圖4-7所示。圖4-7遞歸函數(shù)調(diào)用示意圖
由圖4-7可知,函數(shù)的遞歸調(diào)用可分為兩個(gè)階段:第一個(gè)階段是遞推,即逐層調(diào)用自己,直到遇到可直接返回值的return語(yǔ)句;第二個(gè)階段是回歸,即將結(jié)果逐層代入回去,直到計(jì)算出需要的結(jié)果。
在編寫遞歸函數(shù)時(shí),有兩個(gè)著眼點(diǎn):
(1)遞歸出口:即遞歸結(jié)束的條件,遞歸函數(shù)必須要有出口。在上面的階乘函數(shù)中,if(m==0||m==1)return1;語(yǔ)句就是遞歸出口,當(dāng)形參值為0或1時(shí),遞歸結(jié)束。
(2)遞歸表達(dá)式:如n!=n*(n-1)!,即上例中的f=m*fact(m-1)。
同樣是編寫函數(shù)實(shí)現(xiàn)階乘的計(jì)算,例4-1中階乘函數(shù)使用的是遞推方法,而例4-12中使用的是遞歸方法。
【例4-13】編程:調(diào)用函數(shù)求斐波那契(fibonacci)數(shù)列的第20項(xiàng)。fibonacci數(shù)列:
112358……,該數(shù)列的規(guī)律為,前兩項(xiàng)值為1,從第三項(xiàng)開(kāi)始,每一項(xiàng)是前兩項(xiàng)的和。
程序分析:求fibonacci數(shù)列的第20項(xiàng),要反復(fù)使用遞推公式,直到求出前兩項(xiàng)的值,再逐項(xiàng)求出后面的18項(xiàng),最后得到第20項(xiàng)的值,返回main()函數(shù),輸出結(jié)果。
4.4變量的作用域與生存期
4.4.1局部變量與全局變量變量按作用域可以分為局部變量和全局變量。
1.局部變量在一個(gè)函數(shù)或者復(fù)合語(yǔ)句內(nèi)部定義的變量,叫做局部變量。局部變量只在定義它的函數(shù)或者復(fù)合語(yǔ)句內(nèi)部有效,在此范圍之外是不能使用這些變量的。
【例4-14】局部變量例題。
程序分析:變量a定義在main()函數(shù)中,所以其作用范圍就在main()函數(shù)內(nèi)部;而變量b定義在復(fù)合語(yǔ)句中,所以其作用范圍在復(fù)合語(yǔ)句的兩個(gè)花括號(hào)之間。
程序編譯時(shí),會(huì)在第二個(gè)printf()函數(shù)處指示錯(cuò)誤“'b':undeclaredidentifier”。請(qǐng)思考這是為什么。
2.全局變量
為了解決多個(gè)函數(shù)間共用變量的問(wèn)題,C語(yǔ)言中允許定義全局變量。定義在函數(shù)外,不屬于任何一個(gè)函數(shù)的變量稱為全局變量。一般情況下,全局變量的定義放在第一個(gè)函數(shù)的前面。全局變量的作用范圍是從定義的地方開(kāi)始,直到程序所在文件結(jié)束,作用范圍內(nèi)的所有函數(shù)都可以使用全局變量。
函數(shù)的作用范圍又叫作用域。局部變量的作用域?yàn)樗诤瘮?shù)或復(fù)合語(yǔ)句,而全局變量的作用域?yàn)槎x的地方直到程序運(yùn)行結(jié)束。
【例4-15】全局變量例題。
運(yùn)行結(jié)果:
Inthecompoundstatement,a=0
Inthefunctionf1,a=15
a=10,b=5
由于全局變量使用不當(dāng)會(huì)導(dǎo)致各函數(shù)之間出現(xiàn)干擾,容易出錯(cuò),因此在一般情況下,應(yīng)盡量避免使用全局變量,而盡量使用局部變量和函數(shù)參數(shù)。
4.4.2動(dòng)態(tài)變量與靜態(tài)變量
變量的存儲(chǔ)類型分為動(dòng)態(tài)變量和靜態(tài)變量。對(duì)于動(dòng)態(tài)變量,系統(tǒng)在程序運(yùn)行期間根據(jù)需要為其分配存儲(chǔ)空間,對(duì)于靜態(tài)變量,系統(tǒng)在程序運(yùn)行期間為其分配固定的存儲(chǔ)空間。函數(shù)(含main()函數(shù))以及復(fù)合語(yǔ)句中定義的變量、函數(shù)的形參都屬于動(dòng)態(tài)存儲(chǔ)的變量。動(dòng)態(tài)變量在函數(shù)被調(diào)用之前是不分配存儲(chǔ)空間的,直到函數(shù)被調(diào)用時(shí)系統(tǒng)才會(huì)為函數(shù)中的局部變量分配存儲(chǔ)空間,一旦函數(shù)調(diào)用結(jié)束,系統(tǒng)自動(dòng)回收函數(shù)中局部變量所占用的存儲(chǔ)空間。
動(dòng)態(tài)變量包括自動(dòng)變量和寄存器變量?jī)煞N。在C語(yǔ)言中,每一個(gè)變量和函數(shù)有兩個(gè)屬性:數(shù)據(jù)類型和數(shù)據(jù)的存儲(chǔ)類別。
1.自動(dòng)變量
自動(dòng)變量定義的形式是:
auto類型名變量表;
如:
autointa,b;
定義兩個(gè)自動(dòng)類型的整型變量a和b。
在定義自動(dòng)變量時(shí),auto可以省略,形式與我們以前在函數(shù)中定義普通變量時(shí)完全一樣。所以,我們以前編程過(guò)程中用到的變量都是自動(dòng)變量。
2.寄存器變量
寄存器變量把數(shù)據(jù)存儲(chǔ)在計(jì)算機(jī)寄存器單元上,存取速度比內(nèi)存快得多。但大多數(shù)C語(yǔ)言系統(tǒng)上,并不真正支持寄存器變量的使用,而是把寄存器變量當(dāng)做普通自動(dòng)變量來(lái)處理。寄存器變量只適用于整型。
寄存器變量定義的形式是:
registerint變量表;
3.靜態(tài)局部變量
前面講到的全局變量,由于從定義的地方到程序結(jié)束一直有效,因此其對(duì)應(yīng)的存儲(chǔ)單元一直有效,而全局變量存儲(chǔ)空間的分配也是與自動(dòng)局部變量不同的,其存儲(chǔ)空間是靜態(tài)分配的,即在程序運(yùn)行期間一直保持,不會(huì)被釋放。
與全局變量同樣靜態(tài)分配存儲(chǔ)空間的還有靜態(tài)局部變量,它的作用范圍是函數(shù)的內(nèi)部,但是當(dāng)函數(shù)調(diào)用結(jié)束時(shí),其所占的存儲(chǔ)空間不會(huì)被釋放,值依然保存著,下次調(diào)用還可以繼續(xù)使用。
變量在內(nèi)存中保存的時(shí)間稱為變量的生存周期。前面講過(guò)的普通局部變量,生存周期就是函數(shù)或復(fù)合語(yǔ)句執(zhí)行期間,與作用域相同。而全局變量和靜態(tài)局部變量的生存周期則是程序運(yùn)行期間。請(qǐng)注意,靜態(tài)局部變量的作用域和生存周期并不一樣,作用域是在函數(shù)調(diào)用期間,而生存周期則是程序運(yùn)行的整個(gè)過(guò)程。
靜態(tài)局部變量的定義格式為:
static類型名變量表;
靜態(tài)局部變量如果沒(méi)有在函數(shù)中賦初值,系統(tǒng)會(huì)自動(dòng)為靜態(tài)局部變量賦初值為0。
【例4-16】靜態(tài)局部變量例題。
程序分析:先來(lái)看main()函數(shù),main()函數(shù)中for循環(huán)會(huì)執(zhí)行3次,即調(diào)用3次f1()函數(shù)。靜態(tài)局部變量系統(tǒng)會(huì)自動(dòng)賦初值為0,所以f1()中變量b的初值為0。第一次調(diào)用f1()函數(shù)時(shí),printf()函數(shù)輸出b的值應(yīng)為2,這并不難理解。
4.外部變量
全局變量的作用范圍是整個(gè)程序,只能在某個(gè)模塊中定義一次。如果重復(fù)定義,在程序連接時(shí)會(huì)出現(xiàn)錯(cuò)誤。當(dāng)一個(gè)模塊需要直接訪問(wèn)其他模塊中定義的全局變量時(shí),程序編譯時(shí)會(huì)出現(xiàn)“變量未定義”的錯(cuò)誤。這就需要在該程序模塊開(kāi)頭加上對(duì)全局變量的聲明,即外部變量。
外部變量的聲明格式為:
extern變量名表;
5.靜態(tài)全局變量
當(dāng)程序由多個(gè)文件組成時(shí),在一個(gè)文件中定義的全局變量也可以作用于其他文件,會(huì)造成文件的互相影響。
如果把全局變量聲明為靜態(tài),則這個(gè)靜態(tài)全局變量的作用范圍只限于當(dāng)前的文件,而不會(huì)作用于其他文件,這樣就避免了同一個(gè)程序不同文件中的全局變量的相互影響。
4.5編譯預(yù)處理命令
4.5.1文件包含所謂文件包含,是指一個(gè)源文件可以將另外一個(gè)源文件的內(nèi)容全部包含進(jìn)來(lái)。文件包含的一般形式為#include<文件名>或#include"文件名"
一般來(lái)講,使用C語(yǔ)言標(biāo)準(zhǔn)頭文件時(shí),在文件包含中使用尖括號(hào)<>;使用編程者自己的文件時(shí),在文件包含中使用雙引號(hào)"?"。這兩者并沒(méi)有嚴(yán)格界限,舉例來(lái)說(shuō),在程序中使用?#include<stdio.h>和#i
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 義務(wù)教育課程標(biāo)準(zhǔn)解讀與思考
- 12月病理學(xué)模擬試題(含參考答案解析)
- 木材化學(xué)成分在生物醫(yī)學(xué)工程中的應(yīng)用考核試卷
- 紡織品的綠色染整工藝創(chuàng)新考核試卷
- 肥料制造的農(nóng)田耕作與機(jī)械化作業(yè)考核試卷
- 2025年中子、電子及Γ輻照裝置合作協(xié)議書
- 認(rèn)證認(rèn)可ISO設(shè)施管理體系考核試卷
- 四個(gè)精某著名企業(yè)激勵(lì)故事
- 2025年培南類抗菌藥物項(xiàng)目發(fā)展計(jì)劃
- 蔬菜種植與農(nóng)業(yè)科技創(chuàng)新驅(qū)動(dòng)考核試卷
- 基于單片機(jī)的恒壓供水系統(tǒng)設(shè)計(jì)(附原理圖、程序清單及外文翻譯)
- 賓館飯店消防安全培訓(xùn)課件
- 2022杭州新教科版六年級(jí)科學(xué)下冊(cè)第四單元《物質(zhì)的變化》全部教案(共7課)
- 客房物品擺放標(biāo)準(zhǔn)
- 弘揚(yáng)新時(shí)代科學(xué)家精神(課件)-小學(xué)愛(ài)國(guó)主義教育主題班會(huì)通用版
- 當(dāng)代社會(huì)問(wèn)題課件
- 小學(xué)語(yǔ)文教師基本功大賽試卷及答案
- 某切眼掘進(jìn)工作面開(kāi)口施工的安全技術(shù)措施
- 古代職業(yè)-三教九流
- 某醫(yī)院安全生產(chǎn)三項(xiàng)制度(安全生產(chǎn)責(zé)任制、制度、操作規(guī)程)匯編
- 2022年我國(guó)新能源汽車產(chǎn)業(yè)發(fā)展趨勢(shì)分析
評(píng)論
0/150
提交評(píng)論