版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第4章函數(shù)4.1函數(shù)的定義
4.2函數(shù)參數(shù)與返回值
4.3函數(shù)調(diào)用
4.4函數(shù)的嵌套調(diào)用4.5變量的作用域4.6變量的存儲(chǔ)類(lèi)別
4.1函?數(shù)?的?定?義
4.1.1函數(shù)的基本概念
C程序中有一個(gè)函數(shù)是必須存在的,這就是main函數(shù)(又稱(chēng)為主函數(shù))。main函數(shù)是唯一的,它是C程序執(zhí)行的入口,即程序開(kāi)始執(zhí)行時(shí),系統(tǒng)首先調(diào)用main函數(shù)執(zhí)行。
C程序中所有函數(shù)的定義是平行的,函數(shù)之間不存在嵌套或從屬的關(guān)系,但是函數(shù)之間可以相互調(diào)用。除main函數(shù)不能被其他函數(shù)調(diào)用外,其他函數(shù)都是一個(gè)可以反復(fù)使用的程序段。函數(shù)是通過(guò)被調(diào)用而執(zhí)行的。
【例4.1】
編寫(xiě)程序計(jì)算兩個(gè)整數(shù)絕對(duì)值階乘之差。
程序如下:圖4.1輸入-7和2時(shí)的運(yùn)行結(jié)果例4.1的程序由main和fac兩個(gè)函數(shù)組成。其中fac函數(shù)的功能是求整數(shù)的階乘。程序的執(zhí)行從main函數(shù)開(kāi)始,首先調(diào)用函數(shù)printf輸出提示信息,調(diào)用函數(shù)scanf輸入數(shù)據(jù)。然后先后兩次調(diào)用函數(shù)fac:第一次調(diào)用fac函數(shù)時(shí),由main函數(shù)轉(zhuǎn)到fac函數(shù)執(zhí)行,計(jì)算x絕對(duì)值的階乘,函數(shù)執(zhí)行完后,結(jié)果由return語(yǔ)句返回main函數(shù);第二次調(diào)用fac函數(shù)計(jì)算y絕對(duì)值的階乘。最后調(diào)用函數(shù)printf輸出計(jì)算結(jié)果,程序執(zhí)行結(jié)束。在執(zhí)行函數(shù)fac時(shí)還調(diào)用了函數(shù)abs計(jì)算n的絕對(duì)值。
從上面的例子可以看出,函數(shù)是有區(qū)別的。有一種函數(shù)可以直接使用,例如例4.1中的scanf、printf和abs函數(shù),它們是由C系統(tǒng)提供的,稱(chēng)做C系統(tǒng)的系統(tǒng)函數(shù)或庫(kù)函數(shù)。還有一種函數(shù)用戶(hù)必須定義(即創(chuàng)建)后才能使用,例如例4.1中的fac函數(shù),稱(chēng)做用戶(hù)自定義函數(shù)。使用C語(yǔ)言編程,一定要了解有哪些系統(tǒng)函數(shù)才能有效利用系統(tǒng)提供的資源。
4.1.2函數(shù)的定義
編寫(xiě)C程序的主要工作就是編寫(xiě)用戶(hù)自定義函數(shù),即所謂的函數(shù)定義。函數(shù)定義的一般形式如下:
類(lèi)型標(biāo)識(shí)符函數(shù)名(形式參數(shù)表列)
{??聲明部分
執(zhí)行部分
}輸入“23,4”時(shí),程序運(yùn)行結(jié)果如圖4.2所示。
編寫(xiě)函數(shù)時(shí),函數(shù)名要符合標(biāo)識(shí)符的命名規(guī)則,例如,start_information和end_information。關(guān)于函數(shù)有如下說(shuō)明:
(1)函數(shù)定義時(shí)的參數(shù)稱(chēng)為形式參數(shù),簡(jiǎn)稱(chēng)形參。形式參數(shù)列表說(shuō)明的是函數(shù)間要傳遞的數(shù)據(jù)。調(diào)用函數(shù)與被調(diào)用函數(shù)之間的數(shù)據(jù)傳遞就是依靠形式參數(shù)在調(diào)用時(shí)接收數(shù)據(jù)來(lái)完成的。圖4.2例4.2的運(yùn)行結(jié)果
(2)形式參數(shù)列表由各個(gè)參數(shù)的名字和類(lèi)型說(shuō)明組成。形參列表中若有多個(gè)形參,形參之間用逗號(hào)分隔。例如,“intsum(intx1,intx2)”說(shuō)明sum函數(shù)有兩個(gè)整型參數(shù)x1,x2,即調(diào)用函數(shù)時(shí)需要傳遞的數(shù)據(jù)是兩個(gè)整型數(shù)據(jù)。
(3)如果在形式參數(shù)列表中只列出參數(shù)名,則需要在其后說(shuō)明每個(gè)參數(shù)的類(lèi)型,函數(shù)定的形式變?yōu)?/p>
(4)如果函數(shù)不需要數(shù)據(jù)傳遞,則形式參數(shù)表為空,但“()”不能省略。例如start_information()和end_information()。
(5)花括號(hào)內(nèi)的內(nèi)容稱(chēng)為“函數(shù)體”。聲明部分對(duì)函數(shù)內(nèi)使用的變量進(jìn)行定義和聲明,以及對(duì)被調(diào)用函數(shù)進(jìn)行的聲明。執(zhí)行部分是實(shí)現(xiàn)函數(shù)功能的語(yǔ)句序列。
4.2函數(shù)參數(shù)與返回值
4.2.1函數(shù)的參數(shù)
函數(shù)的參數(shù)分為形參和實(shí)參兩種。形參出現(xiàn)在函數(shù)定義中,在整個(gè)函數(shù)體內(nèi)都可以使用,若離開(kāi)該函數(shù)則不能使用;實(shí)參出現(xiàn)在主調(diào)函數(shù)中。形參和實(shí)參的功能是作數(shù)據(jù)傳送,發(fā)生函數(shù)調(diào)用時(shí),主調(diào)函數(shù)把實(shí)參的值傳送給被調(diào)函數(shù)的形參,從而實(shí)現(xiàn)主調(diào)函數(shù)向被調(diào)函數(shù)的數(shù)據(jù)傳送。
函數(shù)的形參和實(shí)參具有以下特點(diǎn)。
(1)形參變量只有在被調(diào)用時(shí)才分配內(nèi)存單元,在調(diào)用結(jié)束時(shí),即刻釋放所分配的內(nèi)存單元。因此形參只有在函數(shù)內(nèi)部有效,函數(shù)調(diào)用結(jié)束返回主調(diào)函數(shù)后,就不能再使用該形參變量。
(2)實(shí)參可以是常量、變量、表達(dá)式、函數(shù)等,無(wú)論實(shí)參是何種類(lèi)型的量,在進(jìn)行函數(shù)調(diào)用時(shí),它們都必須具有確定的值,以便把這些值傳送給形參。因此應(yīng)預(yù)先用賦值、輸入等辦法使實(shí)參獲得確定值。
(3)實(shí)參和形參在數(shù)量、類(lèi)型、順序上應(yīng)嚴(yán)格一致,否則會(huì)發(fā)生“類(lèi)型不匹配”的錯(cuò)誤。
(4)函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳送是單向的,即只能把實(shí)參的值傳送給形參,而不能把形參的值反向地傳送給實(shí)參。因此在函數(shù)調(diào)用過(guò)程中,形參的值發(fā)生改變對(duì)實(shí)參的值不會(huì)有影響。圖4.3例4.3運(yùn)行結(jié)果4.2.2函數(shù)的返回值
函數(shù)的返回值是指函數(shù)被調(diào)用后,執(zhí)行函數(shù)體的程序段所取得并返回給主調(diào)函數(shù)的值,如調(diào)用正弦函數(shù)取得的正弦值、調(diào)用max函數(shù)取得的最大值等。
(1)函數(shù)的值只能通過(guò)return語(yǔ)句返回主調(diào)函數(shù)。
return語(yǔ)句格式為
return(<表達(dá)式>);
return語(yǔ)句有如下兩個(gè)功能:
①return語(yǔ)句將表達(dá)式的計(jì)算結(jié)果返回給主調(diào)函數(shù);
②結(jié)束return語(yǔ)句所在函數(shù)的執(zhí)行,返回到調(diào)用該函數(shù)的主調(diào)函數(shù)中繼續(xù)執(zhí)行。圖4.4例4.4的運(yùn)行結(jié)果程序說(shuō)明:程序執(zhí)行到product函數(shù)的return語(yǔ)句時(shí),return語(yǔ)句將s的值返回到main函數(shù),在結(jié)束product函數(shù)的執(zhí)行后,返回main函數(shù)繼續(xù)執(zhí)行。return語(yǔ)句返回的s值在main函數(shù)中賦值給了變量p。
(2)函數(shù)返回值的類(lèi)型應(yīng)為定義函數(shù)時(shí)函數(shù)的類(lèi)型。若函數(shù)類(lèi)型與return語(yǔ)句中表達(dá)式值的類(lèi)型不一致,則以函數(shù)類(lèi)型為準(zhǔn)進(jìn)行類(lèi)型轉(zhuǎn)換。例如,如果product函數(shù)為
return語(yǔ)句返回值是float類(lèi)型,而函數(shù)類(lèi)型為double,則將返回值轉(zhuǎn)換成double類(lèi)型返回。
(3)沒(méi)有返回值的函數(shù)用void定義其函數(shù)類(lèi)型。否則,函數(shù)即使不用return語(yǔ)句返回值,函數(shù)仍將返回一個(gè)不確定的值。如例4.2中的start_information和end_information函數(shù)。
(4)如果return語(yǔ)句中沒(méi)有返回值,語(yǔ)句格式為
return;
(5)?return語(yǔ)句可以出現(xiàn)多次,但是每次函數(shù)調(diào)用只能有一條return語(yǔ)句被執(zhí)行。例如下面的example函數(shù): 4.3函數(shù)調(diào)用
4.3.1函數(shù)的聲明
在C程序中,一個(gè)函數(shù)可以被調(diào)用需要以下兩個(gè)前提。
(1)函數(shù)已存在。或者函數(shù)是系統(tǒng)函數(shù)(庫(kù)函數(shù)),或者函數(shù)是用戶(hù)已定義完的函數(shù)。
(2)對(duì)于庫(kù)函數(shù),只要在主調(diào)函數(shù)所在的文件用include命令包含相應(yīng)的頭文件即可;對(duì)于用戶(hù)自定義的函數(shù),除下面將要提到的三種情況外都需要在調(diào)用函數(shù)前對(duì)其進(jìn)行聲明,或者在主調(diào)函數(shù)所在文件用include命令包含被調(diào)用函數(shù)的所在文件。所謂函數(shù)定義,是指編寫(xiě)不存在的函數(shù),函數(shù)只能定義一次。而函數(shù)聲明是對(duì)存在的準(zhǔn)備調(diào)用的函數(shù)進(jìn)行聲明,讓編譯系統(tǒng)可以在編譯階段對(duì)函數(shù)的調(diào)用進(jìn)行合法性檢查,判斷形參與實(shí)參的類(lèi)型及個(gè)數(shù)是否一致,函數(shù)聲明可以多次。
函數(shù)聲明格式就是照寫(xiě)已定義的函數(shù)首部,再加上分號(hào),即
類(lèi)型標(biāo)識(shí)符函數(shù)名(形式參數(shù)表列);輸入“1.5,1.2”時(shí),結(jié)果如圖4.5所示。
C語(yǔ)言規(guī)定,在下列三種情況下,調(diào)用函數(shù)前可以不對(duì)被調(diào)用函數(shù)進(jìn)行聲明:
(1)被調(diào)函數(shù)的返回值類(lèi)型是整型或字符型。例如例4.1,被調(diào)用函數(shù)fac的返回值是整型,main函數(shù)可不必聲明它而直接調(diào)用。
(2)在函數(shù)的外部已對(duì)該函數(shù)聲明,且聲明在主調(diào)函數(shù)的前面。如例4.5。圖4.5例4.5的運(yùn)行結(jié)果圖4.6例4.6的運(yùn)行結(jié)果
(3)被調(diào)用函數(shù)的定義和調(diào)用函數(shù)在同一個(gè)文件內(nèi),且出現(xiàn)在調(diào)用函數(shù)之前。例如例4.3,函數(shù)product出現(xiàn)在函數(shù)main之前,則main函數(shù)可以不對(duì)product函數(shù)聲明而直接調(diào)用。
調(diào)用一個(gè)函數(shù)前進(jìn)行函數(shù)聲明是一種良好的程序設(shè)計(jì)習(xí)慣,除了增加程序的正確性,把錯(cuò)誤改正在初級(jí)階段外,還能提高程序的可讀性。
4.3.2函數(shù)的調(diào)用
函數(shù)的調(diào)用就是主調(diào)函數(shù)通過(guò)數(shù)據(jù)傳遞使用被調(diào)用函數(shù)功能的過(guò)程。數(shù)據(jù)傳遞是通過(guò)形參和實(shí)參完成的。
函數(shù)調(diào)用的一般形式是:
函數(shù)名(實(shí)際參數(shù)表列)說(shuō)明:
(1)調(diào)用函數(shù)時(shí)的參數(shù)稱(chēng)為實(shí)際參數(shù),簡(jiǎn)稱(chēng)實(shí)參。實(shí)參可以是變量、常量或表達(dá)式,是有確定值的參數(shù)。
(2)函數(shù)的形參與實(shí)參要求個(gè)數(shù)相等,并且對(duì)應(yīng)的形參和實(shí)參的類(lèi)型相同。若被調(diào)函數(shù)是無(wú)參函數(shù),則實(shí)參表列為空。
(3)數(shù)據(jù)傳遞是通過(guò)形參接收實(shí)參的數(shù)值來(lái)完成的。函數(shù)調(diào)用時(shí),形參被分配內(nèi)存單元,并接收對(duì)應(yīng)實(shí)參傳來(lái)的值。
【例4.7】
將三個(gè)實(shí)數(shù)按由小到大順序輸出并且輸出它們的和。
程序如下:圖4.7例4.7運(yùn)行結(jié)果例4.7的main函數(shù)執(zhí)行過(guò)程中依次調(diào)用了函數(shù)start_information、函數(shù)sort和函數(shù)end_information。start_information和end_information是無(wú)參數(shù)、無(wú)返回值函數(shù),被main調(diào)用時(shí)無(wú)需數(shù)據(jù)傳遞,執(zhí)行完畢返回main函數(shù)執(zhí)行即可。sort函數(shù)是既有參數(shù),也有函數(shù)返回值的函數(shù)。sort函數(shù)的調(diào)用過(guò)程是一個(gè)完整的函數(shù)調(diào)用過(guò)程,其調(diào)用過(guò)程具體如下:
(1)為函數(shù)的形參x1、x2、x3分配內(nèi)存單元,計(jì)算各個(gè)實(shí)參表達(dá)式a+1、3.0、a的值為5.0、3.0、4.0,并一一對(duì)應(yīng)地賦值給相應(yīng)形參x1、x2、x3。
(2)進(jìn)入sort函數(shù)體,執(zhí)行函數(shù)中的語(yǔ)句,實(shí)現(xiàn)函數(shù)的排序輸出功能。
(3)執(zhí)行到return語(yǔ)句時(shí),計(jì)算return語(yǔ)句中表達(dá)式x3+x2+x1的值并向主調(diào)函數(shù)返回其值,釋放形參及sort函數(shù)內(nèi)的變量所占內(nèi)存,返回main函數(shù)繼續(xù)執(zhí)行。
函數(shù)調(diào)用可以有不同的方式,例如例4.8。圖4.8例4.8的運(yùn)行結(jié)果在例4.8中出現(xiàn)了三種函數(shù)調(diào)用方式,也就是一般函數(shù)的三種調(diào)用方式:
(1)具有返回值的函數(shù)可參加表達(dá)式的計(jì)算。例如例4.8的語(yǔ)句“t=max(x,y)+10;”中的max函數(shù)。
(2)具有返回值的函數(shù)可作為其他函數(shù)的實(shí)參。例如例4.8的語(yǔ)句“printf("\nthemaximumis:%f",max(t,z));”中,max函數(shù)作為printf函數(shù)中的一個(gè)參數(shù);
(3)只完成一定功能而沒(méi)有返回值的函數(shù)可單獨(dú)成為一個(gè)語(yǔ)句,例如例4.8的語(yǔ)句:
end_information();
程序說(shuō)明:若是按自左向右順序求值的系統(tǒng),輸出結(jié)果應(yīng)該是:44。所以該編譯系統(tǒng)是按自右向左順序求值的。圖4.9例4.9的運(yùn)行結(jié)果4.3.3函數(shù)調(diào)用的數(shù)據(jù)傳遞方式
C語(yǔ)言中,函數(shù)的實(shí)參和形參之間的數(shù)據(jù)傳遞是單方向的值傳遞方式。只能將實(shí)參的值傳遞給形參,而不能將形參的值傳遞給實(shí)參。形參值的變化不影響實(shí)參。
當(dāng)調(diào)用函數(shù)時(shí),給形參分配內(nèi)存單元,將實(shí)參的值賦給形式參數(shù)。函數(shù)執(zhí)行完后,形參占用的空間被釋放,實(shí)參仍為調(diào)用前的值。
【例4.10】
形參值的變化不影響實(shí)際參數(shù)的值。
程序如下:
程序說(shuō)明:main函數(shù)調(diào)用函數(shù)change時(shí),系統(tǒng)給形參x、y分配空間,將實(shí)參a的值賦給形參x,實(shí)參b的值賦給形參y。執(zhí)行change函數(shù)時(shí),x、y重新被賦值。change函數(shù)執(zhí)行完x、y占用的空間被釋放。形參x、y的變化影響不到實(shí)參a、b,因此main函數(shù)內(nèi)輸出為“a=3,b=4”。圖4.10例4.10的運(yùn)行結(jié)果
4.4函數(shù)的嵌套調(diào)用
4.4.1函數(shù)的嵌套調(diào)用
C語(yǔ)言中,函數(shù)不允許嵌套定義,但可以嵌套調(diào)用,即在調(diào)用一個(gè)函數(shù)的過(guò)程中,被調(diào)用函數(shù)調(diào)用另一個(gè)函數(shù)。
【例4.11】
求兩個(gè)整數(shù)的最小公倍數(shù)。
程序如下:圖4.11例4.11的運(yùn)行結(jié)果例4.11的程序運(yùn)行過(guò)程如圖4.12所示。從main函數(shù)開(kāi)始執(zhí)行,輸入兩個(gè)整數(shù)后調(diào)用multiple函數(shù),multiple函數(shù)用調(diào)用了divisor函數(shù)。divisor函數(shù)執(zhí)行完返回multiple函數(shù)執(zhí)行,multiple函數(shù)執(zhí)行完返回main函數(shù)執(zhí)行。main函數(shù)執(zhí)行完,程序執(zhí)行結(jié)束。圖4.12嵌套調(diào)用圖4.13例4.12的運(yùn)行結(jié)果4.4.2函數(shù)的遞歸調(diào)用
函數(shù)可以直接或間接地調(diào)用自身,這種調(diào)用方式稱(chēng)為函數(shù)的遞歸調(diào)用。例如,例4.13和例4.14都屬于函數(shù)的遞歸調(diào)用,例4.13直接調(diào)用自身,例4.14是間接的調(diào)用自身。
注意:雖然遞歸是直接或間接的調(diào)用自身,但和調(diào)用其他函數(shù)一樣每次被調(diào)用都需要重新開(kāi)辟空間,并不共用同一內(nèi)存空間。因此調(diào)用自身和調(diào)用其他函數(shù)的調(diào)用過(guò)程沒(méi)有
區(qū)別。例4.13和例4.14的遞歸調(diào)用是無(wú)休止的自身調(diào)用。顯然無(wú)休止的調(diào)用是不合理的,也是不允許的。合理的遞歸調(diào)用應(yīng)是有限的,是滿(mǎn)足一定條件能停止的遞歸調(diào)用。例4.15就是一個(gè)合理的遞歸調(diào)用。
【例4.15】
求n!的遞歸程序。
程序如下:圖4.14例4.15的運(yùn)行結(jié)果如圖4.15所示,例4.15在輸入3時(shí)的遞歸調(diào)用過(guò)程為:從main函數(shù)調(diào)用fac函數(shù)求3!開(kāi)始,變成fac函數(shù)調(diào)用fac函數(shù)求2!,再變成fac函數(shù)調(diào)用fac函數(shù)求1!。然后再返回1!的值,得到2!,返回2!的值,得到3!,返回main函數(shù)輸出。圖4.15遞歸調(diào)用由例4.15看出,函數(shù)遞歸調(diào)用的過(guò)程可分為遞歸過(guò)程和回溯過(guò)程兩個(gè)階段。
(1)遞歸過(guò)程:將原始問(wèn)題不斷轉(zhuǎn)化為規(guī)模更小且處理方式相同的新問(wèn)題。
(2)回溯過(guò)程:從已知條件出發(fā),沿遞歸的逆過(guò)程逐一求值返回,直至遞歸初始處,則完成遞歸調(diào)用。
通過(guò)fac函數(shù)執(zhí)行過(guò)程的分析可以看出遞歸算法解決問(wèn)題的方式:將初始問(wèn)題轉(zhuǎn)化為解決方法相同的新問(wèn)題,而新問(wèn)題的規(guī)模要比原始問(wèn)題??;新問(wèn)題又可以轉(zhuǎn)化為規(guī)模更小的問(wèn)題;這樣處理問(wèn)題直至最終歸結(jié)到可以簡(jiǎn)單解決的問(wèn)題——遞歸的終結(jié)條件。遞歸調(diào)用會(huì)占用大量?jī)?nèi)存和時(shí)間,使得執(zhí)行效率低。但采用遞歸方法編寫(xiě)的程序簡(jiǎn)潔、可讀性好。其優(yōu)點(diǎn)使遞歸方法成為解決某些問(wèn)題的最佳方法,例如漢諾塔問(wèn)題。
【例4.16】
漢諾塔問(wèn)題:古代有一座梵塔,塔內(nèi)有a、b、c三個(gè)底座,上面可放盤(pán)子。初始a座上有n個(gè)盤(pán)子,這些盤(pán)子大小各不相同,大盤(pán)在下,小盤(pán)在上,依次排列。要求將a座上n個(gè)盤(pán)子移至c座上,每次只能移動(dòng)一個(gè),但要求移動(dòng)過(guò)程中保持3個(gè)座上始終小盤(pán)子在上,大盤(pán)子在下。移動(dòng)過(guò)程中可以借助b座實(shí)現(xiàn)移動(dòng)。編寫(xiě)程序求出盤(pán)子的移動(dòng)步驟。
問(wèn)題分析:這個(gè)問(wèn)題可用遞歸思想分析,將n個(gè)盤(pán)子由a座移動(dòng)到c座可分為如下三個(gè)過(guò)程:
(1)先將a座上n-1個(gè)盤(pán)子借助c座移至b座;
(2)再將a座上最下面一個(gè)盤(pán)子移至c座;
(3)最后將b座上n-1個(gè)盤(pán)子借助a座移至c座。
這樣就把移動(dòng)n個(gè)盤(pán)子的問(wèn)題轉(zhuǎn)化為移動(dòng)n-1個(gè)盤(pán)子的問(wèn)題。按這種思路,再將移動(dòng)n-1個(gè)盤(pán)子的問(wèn)題轉(zhuǎn)化為移動(dòng)n-2個(gè)盤(pán)子的問(wèn)題,直至移動(dòng)一個(gè)盤(pán)子。程序如下:
圖4.16例4.16的運(yùn)行結(jié)果
4.5變量的作用域
編寫(xiě)程序時(shí),除了要了解變量占用內(nèi)存大小和運(yùn)算規(guī)則外,還需要知道變量的作用域和存儲(chǔ)類(lèi)型。
變量只能在它的作用范圍內(nèi)使用,即變量在它的作用域之外不能被引用。變量的作用域直接與變量定義的位置相關(guān)。在函數(shù)內(nèi)部(或復(fù)合語(yǔ)句內(nèi)部)定義的變量稱(chēng)為內(nèi)部變量。內(nèi)部變量的作用域是定義它的函數(shù)(或復(fù)合語(yǔ)句)。在函數(shù)外任意位置定義的變量稱(chēng)為外部變量。外部變量的作用域是從定義或聲明的位置開(kāi)始,直至它所在源程序文件的結(jié)束。
【例4.17】
注意變量的作用域。例4.17中main函數(shù)的內(nèi)部變量x、y和函數(shù)f1的內(nèi)部變量x、y雖然同名,卻是完全不相關(guān)的變量。因?yàn)樗鼈兊淖饔糜蛲耆煌?,是不同的變量,不產(chǎn)生沖突。如圖4.17所示。
作用域不同的同名變量有時(shí)會(huì)出現(xiàn)作用域的部分重疊,這時(shí)系統(tǒng)通常都選擇作用域范圍小的變量有效。例如例4.18函數(shù)f1的內(nèi)部變量a、b和全局變量a、b重疊,但是執(zhí)行f1時(shí),有效的是內(nèi)部變量a、b。圖4.17相關(guān)變量的作用域圖4.18例4.18的運(yùn)行結(jié)果內(nèi)部變量有助于實(shí)現(xiàn)信息隱蔽,即使不同的函數(shù)定義了同名的內(nèi)部變量,也不會(huì)相互影響。而外部變量的使用增加了函數(shù)之間傳遞數(shù)據(jù)的途徑。如果一個(gè)函數(shù)需要返回兩個(gè)或兩個(gè)以上的計(jì)算結(jié)果時(shí),可以使用外部變量傳遞數(shù)據(jù)。例如,例4.19使用外部變量將函數(shù)f1計(jì)算的四個(gè)結(jié)果傳送到了main函數(shù)中。
【例4.19】
求兩個(gè)數(shù)的和、差、積、商。
程序如下:輸入“8811”時(shí),程序的運(yùn)行結(jié)果如圖4.19所示。
外部變量的使用會(huì)降低函數(shù)的通用性。過(guò)多使用外部變量,會(huì)使函數(shù)之間的依賴(lài)性增加,耦合性增高。這種情況不利于程序的結(jié)構(gòu)化設(shè)計(jì)方式。因此,除非真正需要,建議避免使用外部變量。圖4.19例4.19的運(yùn)行結(jié)果
4.6變量的存儲(chǔ)類(lèi)別
根據(jù)變量在程序運(yùn)行期間是否需占用固定的存儲(chǔ)單元,變量的存儲(chǔ)類(lèi)別可分為以下兩類(lèi)。
(1)動(dòng)態(tài)存儲(chǔ):程序運(yùn)行期間不需要長(zhǎng)期占用內(nèi)存單元。動(dòng)態(tài)存儲(chǔ)的變量有auto(自動(dòng))類(lèi)型和register(寄存器)類(lèi)型。
(2)靜態(tài)存儲(chǔ):靜態(tài)存儲(chǔ)的變量在編譯時(shí)被分配空間,在整個(gè)程序運(yùn)行期間一直占用固定的內(nèi)存空間,程序運(yùn)行結(jié)束才釋放內(nèi)存空間??梢杂胹tatic、extern定義和聲明靜態(tài)存儲(chǔ)類(lèi)別的變量。
C程序運(yùn)行時(shí)占用的內(nèi)存空間通常分為程序區(qū)、靜態(tài)存儲(chǔ)區(qū)和動(dòng)態(tài)存儲(chǔ)區(qū)三部分。動(dòng)態(tài)存儲(chǔ)類(lèi)別的變量可存放在兩個(gè)地方——?jiǎng)討B(tài)存儲(chǔ)區(qū)和寄存器。靜態(tài)存儲(chǔ)類(lèi)別的變量只能存放于靜態(tài)存儲(chǔ)區(qū)中。
定義變量時(shí)需要說(shuō)明存儲(chǔ)類(lèi)別。因此,完整的變量定義形式應(yīng)為
存儲(chǔ)類(lèi)別數(shù)據(jù)類(lèi)型變量列表;4.6.1內(nèi)部變量的存儲(chǔ)類(lèi)別
內(nèi)部變量可存放于內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)、靜態(tài)存儲(chǔ)區(qū)和寄存器。但無(wú)論內(nèi)部變量存放在何處,它的作用域是不變的。
1.auto(自動(dòng))變量
C系統(tǒng)默認(rèn)內(nèi)部變量的存儲(chǔ)類(lèi)型是auto類(lèi)型。例如,函數(shù)內(nèi)部的語(yǔ)句“inta;”和語(yǔ)句“autointa;”是完全等價(jià)的。
自動(dòng)變量在其定義所在的函數(shù)(或復(fù)合語(yǔ)句)開(kāi)始執(zhí)行時(shí)才分得內(nèi)存空間,在該函數(shù)(或復(fù)合語(yǔ)句)執(zhí)行期間占用內(nèi)存空間。在函數(shù)(或復(fù)合語(yǔ)句)執(zhí)行結(jié)束時(shí)自動(dòng)變量占用的空間被系統(tǒng)收回。
例4.20中的函數(shù)f1被調(diào)用時(shí),系統(tǒng)在動(dòng)態(tài)存儲(chǔ)區(qū)內(nèi)分配空間給auto變量a、b。當(dāng)f1結(jié)束時(shí),系統(tǒng)回收變量a、b所占內(nèi)存空間。圖4.20例4.20的運(yùn)行結(jié)果
2.register(寄存器)變量
register變量和auto變量不同之處在于register變量被存放在寄存器中,因此比auto變量存取速度快得多。通常將頻繁使用的變量放在寄存器中,以提高程序的執(zhí)行速度。例如循環(huán)體內(nèi)涉及的內(nèi)部變量可定義為register變量。
計(jì)算機(jī)中寄存器的數(shù)量是有限的,而且寄存器的數(shù)據(jù)長(zhǎng)度也是有限的。因此register變量不能定義太多,也不能是數(shù)據(jù)類(lèi)型太大的變量(如數(shù)組、結(jié)構(gòu)體等類(lèi)型的變量)。
現(xiàn)今register變量定義通常是不必要的。優(yōu)化的編譯系統(tǒng)能夠識(shí)別使用頻繁的變量,并將其放到寄存器之中。
3.static(靜態(tài))變量
static變量存放在內(nèi)存中的靜態(tài)存儲(chǔ)區(qū)。static內(nèi)部變量在整個(gè)程序運(yùn)行期間占用固定的內(nèi)存單元。即使static內(nèi)部變量所在的函數(shù)執(zhí)行結(jié)束后,static內(nèi)部變量也不釋放存儲(chǔ)單元。因而再次調(diào)用static內(nèi)部變量所在函數(shù)時(shí),static內(nèi)部變量的值為上次調(diào)用結(jié)束時(shí)的值。
系統(tǒng)在編譯時(shí)為static變量分配空間并賦初值,對(duì)于
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年蔬菜印畫(huà)小班教案
- 2024年福建省事業(yè)編考試《公共基礎(chǔ)知識(shí)之人文科技常識(shí)》必刷500題帶解析答案
- 第5單元 二戰(zhàn)后的世界變化(B卷·能力提升練)(解析版)
- 制度與經(jīng)濟(jì)發(fā)展課件
- 2025沙場(chǎng)承包合同協(xié)議書(shū)
- 年產(chǎn)800萬(wàn)只節(jié)能燈整燈生產(chǎn)可行性研究報(bào)告建議書(shū)申請(qǐng)備案
- 2025關(guān)于房屋租賃合同的履約保證金問(wèn)題
- 2024年度四川省公共營(yíng)養(yǎng)師之四級(jí)營(yíng)養(yǎng)師題庫(kù)綜合試卷A卷附答案
- 2024年度四川省公共營(yíng)養(yǎng)師之三級(jí)營(yíng)養(yǎng)師考前自測(cè)題及答案
- 2025關(guān)于商標(biāo)權(quán)轉(zhuǎn)讓合同范本
- 學(xué)術(shù)不端行為治理研究
- 企業(yè)文化、戰(zhàn)略與電力能源知識(shí)參考題庫(kù)練習(xí)卷含答案(一)
- 福建南平武夷高新技術(shù)產(chǎn)業(yè)控股集團(tuán)有限公司招聘筆試沖刺題2024
- 2024年設(shè)備維修部管理制度(6篇)
- GB/T 45083-2024再生資源分揀中心建設(shè)和管理規(guī)范
- 精神科護(hù)理工作計(jì)劃例文
- 2024山地買(mǎi)賣(mài)合同模板
- 河北省承德市2023-2024學(xué)年高一上學(xué)期期末物理試卷(含答案)
- 【初中化學(xué)】二氧化碳的實(shí)驗(yàn)室制取教學(xué)課件-2024-2025學(xué)年九年級(jí)化學(xué)人教版上冊(cè)
- 出租車(chē)行業(yè)服務(wù)質(zhì)量提升方案
- 景區(qū)安全管理教育培訓(xùn)
評(píng)論
0/150
提交評(píng)論