- 相關(guān)推薦
C語言函數(shù)的參數(shù)和返回值
C 語言可以象匯編語言一樣對(duì)位、字節(jié)和地址進(jìn)行操作。那么大家知道C語言函數(shù)的參數(shù)和返回值是什么呢?下面一起來看看!
C語言函數(shù)的參數(shù)和返回值1
如果把函數(shù)比喻成一臺(tái)機(jī)器,那么參數(shù)就是原材料,返回值就是最終產(chǎn)品;函數(shù)的作用就是根據(jù)不同的參數(shù)產(chǎn)生不同的返回值。
函數(shù)的參數(shù)
在函數(shù)定義中出現(xiàn)的參數(shù)可以看做是一個(gè)占位符,它沒有數(shù)據(jù),只能等到函數(shù)被調(diào)用時(shí)接收傳遞進(jìn)來的數(shù)據(jù),所以稱為形式參數(shù),簡稱形參。
函數(shù)被調(diào)用時(shí)給出的參數(shù)包含了實(shí)實(shí)在在的數(shù)據(jù),會(huì)被函數(shù)內(nèi)部的代碼使用,所以稱為實(shí)際參數(shù),簡稱實(shí)參。
形參和實(shí)參的功能是作數(shù)據(jù)傳送,發(fā)生函數(shù)調(diào)用時(shí),實(shí)參的值會(huì)傳送給形參。
形參和實(shí)參有以下幾個(gè)特點(diǎn):
1) 形參變量只有在函數(shù)被調(diào)用時(shí)才會(huì)分配內(nèi)存,調(diào)用結(jié)束后,立刻釋放內(nèi)存,所以形參變量只有在函數(shù)內(nèi)部有效,不能在函數(shù)外部使用。
2) 實(shí)參可以是常量、變量、表達(dá)式、函數(shù)等,無論實(shí)參是何種類型的數(shù)據(jù),在進(jìn)行函數(shù)調(diào)用時(shí),它們都必須有確定的值,以便把這些值傳送給形參,所以應(yīng)該提前用賦值、輸入等辦法使實(shí)參獲得確定值。
3) 實(shí)參和形參在數(shù)量上、類型上、順序上必須嚴(yán)格一致,否則會(huì)發(fā)生“類型不匹配”的錯(cuò)誤。
函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳送是單向的,只能把實(shí)參的值傳送給形參,而不能把形參的值反向地傳送給實(shí)參。 因此在函數(shù)調(diào)用過程中,形參的值發(fā)生改變,而實(shí)參中的值不會(huì)變化。
【示例】計(jì)算 1+2+3+...+(n-1)+n 的值。
#includeint sum(int n){ int i; for(i=n-1; i>=1; i--){ n+=i; } printf("The inner n = %d ",n); return n;}int main(){ int m, total; printf("Input a number: "); scanf("%d", &m); total = sum(m); printf("The outer m = %d ", m); printf("1+2+3+...+%d+%d = %d ", m-1, m, total); return 0;}
運(yùn)行結(jié)果:
Input a number: 100↙
The inner n = 5050
The outer m = 100
1+2+3+...+99+100 = 5050
通過 scanf 輸入 m 的值,作為實(shí)參,在調(diào)用 sum 時(shí)傳送給形參 n。
從運(yùn)行情況看,輸入 m 值為100,即實(shí)參 m 的值為100,把這個(gè)值傳給函數(shù) sum 時(shí),形參 n 的初值也為100,在函數(shù)執(zhí)行過程中,形參 n 的`值變?yōu)?5050。函數(shù)運(yùn)行結(jié)束后,輸出實(shí)參 m 的值仍為100,可見實(shí)參的值不隨形參的變化而變化。
函數(shù)的返回值
函數(shù)的返回值是指函數(shù)被調(diào)用之后,執(zhí)行函數(shù)體中的程序段所取得的值,可以通過return語句返回。
return語句的一般形式為:
return 表達(dá)式;
或者:
return (表達(dá)式);
例如:
return max;
return a+b;
return (100+200);
函數(shù)中可以有多個(gè) return 語句,但每次調(diào)用只能有一個(gè)return 語句被執(zhí)行,所以只有一個(gè)返回值。
一旦遇到 return 語句,不管后面有沒有代碼,函數(shù)立即運(yùn)行結(jié)束,將值返回。例如:
int func(){ int a=100, b=200, c; return a+b; return a*b; return b/a;}
返回值始終 a+b 的值,也就是300。
沒有返回值的函數(shù)為空類型,用void進(jìn)行說明。例如:
void func(){ printf("Hello world! ");}
一旦函數(shù)的返回值類型被定義為 void,就不能再接收它的值了。例如,下面的語句是錯(cuò)誤的:
int a = func();
為了使程序有良好的可讀性并減少出錯(cuò), 凡不要求返回值的函數(shù)都應(yīng)定義為 void 類型。
C語言函數(shù)的參數(shù)和返回值2
函數(shù)的一般形式是:type-specifier function_name(parameter list)parameter declarations{body of the function}類型說明符定義了函數(shù)中return語句返回值的類型,該返回值可以是任何有效類型。如果沒有類型說明符出現(xiàn),函數(shù)返回一個(gè)整型值。參數(shù)表是一個(gè)用逗號(hào)分隔的變量表,當(dāng)函數(shù)被調(diào)用時(shí)這些變量接收調(diào)用參數(shù)的值。一個(gè)函數(shù)可以沒有參數(shù),這時(shí)函數(shù)表是空的。但即使沒有參數(shù),括號(hào)仍然是必須要有的。參數(shù)說明段定義了其中參數(shù)的類型。當(dāng)一個(gè)函數(shù)沒有明確說明類型時(shí),C語言的編譯程序自動(dòng)將整型(int)作為這個(gè)函數(shù)的缺省類型,缺省類型適用于很大一部分函數(shù)。當(dāng)有必要返回其它類型數(shù)據(jù)時(shí),需要分兩步處理:首先,必須給函數(shù)以明確的類型說明符;其次,函數(shù)類型的說明必須處于對(duì)它的首次調(diào)用之前。只有這樣,C編譯程序才能為返回非整型的值的函數(shù)生成正確代碼。
一、函數(shù)的類型說明可將函數(shù)說明為返回任何一種合法的C語言數(shù)據(jù)類型
類型說明符告訴編譯程序它返回什么類型的數(shù)據(jù)。這個(gè)信息對(duì)于程序能否正確運(yùn)行關(guān)系極大,因?yàn)椴煌臄?shù)據(jù)有不同的長度和內(nèi)部表示。返回非整型數(shù)據(jù)的函數(shù)被使用之前,必須把它的類型向程序的其余部分說明。若不這樣做,C語言的編譯程序就認(rèn)為函數(shù)是返回整型數(shù)據(jù)的函數(shù),調(diào)用點(diǎn)又在函數(shù)類型說明之前,編譯程序就會(huì)對(duì)調(diào)用生成錯(cuò)誤代碼。為了防止上述問題的.出現(xiàn),必須使用一個(gè)特別的說明語句,通知編譯程序這個(gè)函數(shù)返回什么值。下例示出了這種方法。
第一個(gè)函數(shù)的類型說明sum()函數(shù)返回浮點(diǎn)類型的數(shù)據(jù)。這個(gè)說明使編譯程序能夠?qū)um()的調(diào)用產(chǎn)生正確代碼。函數(shù)類型說明語句的一般形式是:type_specifier function_name(;)即使函數(shù)使用形參,也不要將其寫入說明句。若未使用類型說明語句,函數(shù)返回的數(shù)據(jù)類型可能與調(diào)用者所要求的不一致,其結(jié)果是難以預(yù)料的。如果兩者同處于一個(gè)文件中,編譯程序可以發(fā)現(xiàn)該錯(cuò)誤并停止編譯。如果不在同一個(gè)文件中,編譯程序無法發(fā)現(xiàn)這種錯(cuò)誤。類型檢查僅在編譯中進(jìn)行,鏈接和運(yùn)行時(shí)均不檢查。因此,必須十分細(xì)心以確保絕不發(fā)生上述錯(cuò)誤。當(dāng)被說明為整型的函數(shù)返回字符時(shí),這個(gè)字符值被轉(zhuǎn)換為整數(shù)。因?yàn)镃語言以不加說明的方式進(jìn)行字符型與整型之間的數(shù)據(jù)轉(zhuǎn)換,因而多數(shù)情況下,返回字符值的函數(shù)并不是說明為返回字符值,而是由函數(shù)的這種字符型向整型的缺省類型轉(zhuǎn)換隱含實(shí)現(xiàn)的。
二、返回語句
返回語句return有兩個(gè)重要用途。第一,它使得內(nèi)含它的那個(gè)函數(shù)立即退出,也就是使程序返回到調(diào)用語句處繼續(xù)進(jìn)行。第二,它可以用來回送一個(gè)數(shù)值。本章將說明這兩個(gè)用途。
(一)從函數(shù)返回函數(shù)可以用兩種方法停止運(yùn)行并返回到調(diào)用程序
第一種是在執(zhí)行完函數(shù)的最后一個(gè)語句之后,從概念上講,是遇到了函數(shù)的結(jié)束符“}”(當(dāng)然這個(gè)花括號(hào)實(shí)際上并不會(huì)出現(xiàn)在目標(biāo)碼中,但我們可以這樣理解)。例如,下面的函數(shù)在屏幕上顯示一個(gè)字符串。
一旦字串顯示完畢,函數(shù)就沒事可做了,這時(shí)它返回到被調(diào)用處。在實(shí)際情況中,沒有多少函數(shù)是以這種缺省方式終止運(yùn)行的。因?yàn)橛袝r(shí)必須送回一個(gè)值,大多數(shù)函數(shù)用return語句終止運(yùn)行,有時(shí)在函數(shù)中設(shè)立了多個(gè)終止點(diǎn)以簡化函數(shù)、提高效率。切記,一個(gè)函數(shù)可以有多個(gè)返回語句。如下所示,函數(shù)在s1、s2相等時(shí)返回1,不相等時(shí)返回-1。
(二)返回值所有的函數(shù)
除了空值類型外,都返回一個(gè)數(shù)值。該數(shù)值由返回語句確定。無返回語句時(shí),返回值是0。這就意味著,只要函數(shù)沒有被說明為空值,它就可以用在任何有效的C語言表達(dá)式中作為操作數(shù)。這樣下面的表達(dá)式都是合法的C語言表達(dá)式。x=power(y);if(max(x,y)>100)printf(“greater;”)for(ch=get);isdigit(ch);)...;可是,函數(shù)不能作為賦值對(duì)象,下列語句是錯(cuò)誤的:swap(x,y)=100;C編譯程序?qū)⒄J(rèn)為這個(gè)語句是錯(cuò)誤的,而且對(duì)含有這種錯(cuò)誤語句的程序不予編譯。所有非空值的函數(shù)都會(huì)返回一個(gè)值。我們編寫的程序中大部分函數(shù)屬于三種類型。第一種類型是簡單計(jì)算型-函數(shù)設(shè)計(jì)成對(duì)變量進(jìn)行運(yùn)算,并且返回計(jì)算值。
計(jì)算型函數(shù)實(shí)際上是一個(gè)“純”函數(shù),例如sqr()和sin()。第二類函數(shù)處理信息,并且返回一個(gè)值,僅以此表示處理的成功或失敗。例如write(),用于向磁盤文件寫信息。如果寫操作成功了,write()返回寫入的字節(jié)數(shù),當(dāng)函數(shù)返回-1時(shí),標(biāo)志寫操作失敗。最后一類函數(shù)沒有明確的返回值。實(shí)際上這類函數(shù)是嚴(yán)格的過程型函數(shù),不產(chǎn)生值。
如果讀者用的是符合ANSI建議標(biāo)準(zhǔn)的C編譯程序,那么所有這一類函數(shù)應(yīng)當(dāng)被說明為空值類型。奇怪的是,那些并不產(chǎn)生令人感興趣的結(jié)果的函數(shù)卻無論如何也要返回某些東西。例如printf( )返回被寫字符的個(gè)數(shù)。然而,很難找出一個(gè)真正檢查這個(gè)返回值的程序。因此,雖然除了空值函數(shù)以外的所有函數(shù)都返回一個(gè)值,我們卻不必非得去使用這個(gè)返回值。有關(guān)函數(shù)返回值的一個(gè)常見問題是:既然這個(gè)值是被返回的,我是不是必須把它賦給某個(gè)變量?回答是:不必。如果沒有用它賦值,那它就被丟棄了。請(qǐng)看下面的程序,它使用了mul( )函數(shù)。mul( )函數(shù)定義為:int mul(int x, int y){......}
在第一行, mul( )的返回值被賦予z,在第二行中,返回值實(shí)際上沒有賦給任何變量,但被printf( )函數(shù)所使用。最后,在第三行,返回值被丟棄不用,因?yàn)榧葲]有把它賦給第一個(gè)變量,也沒有把它用作表達(dá)式中的一部分。