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