4.1 函數(shù)說明與返回值
當(dāng)一個函數(shù)沒有明確說明類型時, C語言的編譯程序自動將整型( i n t)作為這個函數(shù)的缺省類型,缺省類型適用于很大一部分函數(shù)。當(dāng)有必要返回其它類型數(shù)據(jù)時,需要分兩步處理:
首先,必須給函數(shù)以明確的類型說明符;
其次,函數(shù)類型的說明必須處于對它的首次調(diào)用之前。只有這樣,C編譯程序才能為返回非整型的值的函數(shù)生成正確代碼。
4.1.1 函數(shù)的類型說明
可將函數(shù)說明為返回任何一種合法的C語言數(shù)據(jù)類型。
類型說明符告訴編譯程序它返回什么類型的數(shù)據(jù)。這個信息對于程序能否正確運行關(guān)系極大,因為不同的數(shù)據(jù)有不同的長度和內(nèi)部表示。
返回非整型數(shù)據(jù)的函數(shù)被使用之前,必須把它的類型向程序的其余部分說明。若不這樣做,C語言的編譯程序就認(rèn)為函數(shù)是返回整型數(shù)據(jù)的函數(shù),調(diào)用點又在函數(shù)類型說明之前,編譯程序就會對調(diào)用生成錯誤代碼。為了防止上述問題的出現(xiàn),必須使用一個特別的說明語句。
[例4 - 1 ]
float sum( ); / *函數(shù)說明* /
main( )
{
float first,s e c o n d ;
first =123.23;
second = 99.09;
printf ("%f",sum (first,s e c o n d ) );
}
float sum (a,b ) / * 函數(shù)定義* /
float a,b;
{
return a+b;
}
第一個函數(shù)的類型說明sum( )函數(shù)返回浮點類型的數(shù)據(jù)。這個說明使編譯程序能夠?qū)um( )的調(diào)用產(chǎn)生正確代碼。
函數(shù)類型說明語句的一般形式是:
type_specifier function_name ( ) ;
即使函數(shù)使用形參,也不要將其寫入說明句。若未使用類型說明語句,函數(shù)返回的數(shù)據(jù)類型可能與調(diào)用者所要求的不一致,其結(jié)果是難以預(yù)料的。如果兩者同處于一個文件中,編譯程序可以發(fā)現(xiàn)該錯誤并停止編譯。如果不在同一個文件中,編譯程序無法發(fā)現(xiàn)這種錯誤。類型檢查僅在編譯中進(jìn)行,鏈接和運行時均不檢查。因此,必須十分細(xì)心以確保絕不發(fā)生上述錯誤。當(dāng)被說明為整型的函數(shù)返回字符時,這個字符值被轉(zhuǎn)換為整數(shù)。因為C語言以不加說明的方式進(jìn)行字符型與整型之間的數(shù)據(jù)轉(zhuǎn)換,因而多數(shù)情況下,返回字符值的函數(shù)并不是說明為返回字符值,而是由函數(shù)的這種字符型向整型的缺省類型轉(zhuǎn)換隱含實現(xiàn)的。
4.1.2 返回語句
返回語句return有兩個重要用途。第一,它使得內(nèi)含它的那個函數(shù)立即退出,也就是使程序返回到調(diào)用語句處繼續(xù)進(jìn)行。第二,它可以用來回送一個數(shù)值。本章將說明這兩個用途。
1. 從函數(shù)返回
函數(shù)可以用兩種方法停止運行并返回到調(diào)用程序。第一種是在執(zhí)行完函數(shù)的最后一個語句之后,從概念上講,是遇到了函數(shù)的結(jié)束符“ }”(當(dāng)然這個花括號實際上并不會出現(xiàn)在目標(biāo)碼中,但我們可以這樣理解)。例如,下面的函數(shù)在屏幕上顯示一個字符串。
[例4 - 2 ]
pr_reverse ()
{
char s[80]; / *定義一個字符數(shù)組* /
scanf("%s",s); / *輸入一個字符串,其長度不超過7 9個字符* /
printf("%s\n",s);
}
一旦字串顯示完畢,函數(shù)就沒事可做了,這時它返回到被調(diào)用處。
在實際情況中,沒有多少函數(shù)是以這種缺省方式終止運行的。因為有時必須送回一個值,大多數(shù)函數(shù)用return語句終止運行,有時在函數(shù)中設(shè)立了多個終止點以簡化函數(shù)、提高效率。切記,一個函數(shù)可以有多個返回語句。如下所示,函數(shù)在s1、s2相等時返回1,不相等時返回- 1。
[例4 - 3 ]
find_char(s1,s2)
char s1,s2;
{
if(s1 == s2)
return 1;
else
return -1;
}
2. 返回值
所有的函數(shù),除了空值類型外,都返回一個數(shù)值(切記,空值是A N S I建議標(biāo)準(zhǔn)所做的擴展,也許并不適合讀者手頭的C編譯程序)。該數(shù)值由返回語句確定。無返回語句時,返回值是0。這就意味著,只要函數(shù)沒有被說明為空值,它就可以用在任何有效的C語言表達(dá)式中作為操作數(shù)。這樣下面的表達(dá)式都是合法的C語言表達(dá)式。
x = power(y);
if(max (x,y) >100) printf("greater");
當(dāng)一個函數(shù)沒有明確說明類型時, C語言的編譯程序自動將整型( i n t)作為這個函數(shù)的缺省類型,缺省類型適用于很大一部分函數(shù)。當(dāng)有必要返回其它類型數(shù)據(jù)時,需要分兩步處理:
首先,必須給函數(shù)以明確的類型說明符;
其次,函數(shù)類型的說明必須處于對它的首次調(diào)用之前。只有這樣,C編譯程序才能為返回非整型的值的函數(shù)生成正確代碼。
4.1.1 函數(shù)的類型說明
可將函數(shù)說明為返回任何一種合法的C語言數(shù)據(jù)類型。
類型說明符告訴編譯程序它返回什么類型的數(shù)據(jù)。這個信息對于程序能否正確運行關(guān)系極大,因為不同的數(shù)據(jù)有不同的長度和內(nèi)部表示。
返回非整型數(shù)據(jù)的函數(shù)被使用之前,必須把它的類型向程序的其余部分說明。若不這樣做,C語言的編譯程序就認(rèn)為函數(shù)是返回整型數(shù)據(jù)的函數(shù),調(diào)用點又在函數(shù)類型說明之前,編譯程序就會對調(diào)用生成錯誤代碼。為了防止上述問題的出現(xiàn),必須使用一個特別的說明語句。
[例4 - 1 ]
float sum( ); / *函數(shù)說明* /
main( )
{
float first,s e c o n d ;
first =123.23;
second = 99.09;
printf ("%f",sum (first,s e c o n d ) );
}
float sum (a,b ) / * 函數(shù)定義* /
float a,b;
{
return a+b;
}
第一個函數(shù)的類型說明sum( )函數(shù)返回浮點類型的數(shù)據(jù)。這個說明使編譯程序能夠?qū)um( )的調(diào)用產(chǎn)生正確代碼。
函數(shù)類型說明語句的一般形式是:
type_specifier function_name ( ) ;
即使函數(shù)使用形參,也不要將其寫入說明句。若未使用類型說明語句,函數(shù)返回的數(shù)據(jù)類型可能與調(diào)用者所要求的不一致,其結(jié)果是難以預(yù)料的。如果兩者同處于一個文件中,編譯程序可以發(fā)現(xiàn)該錯誤并停止編譯。如果不在同一個文件中,編譯程序無法發(fā)現(xiàn)這種錯誤。類型檢查僅在編譯中進(jìn)行,鏈接和運行時均不檢查。因此,必須十分細(xì)心以確保絕不發(fā)生上述錯誤。當(dāng)被說明為整型的函數(shù)返回字符時,這個字符值被轉(zhuǎn)換為整數(shù)。因為C語言以不加說明的方式進(jìn)行字符型與整型之間的數(shù)據(jù)轉(zhuǎn)換,因而多數(shù)情況下,返回字符值的函數(shù)并不是說明為返回字符值,而是由函數(shù)的這種字符型向整型的缺省類型轉(zhuǎn)換隱含實現(xiàn)的。
4.1.2 返回語句
返回語句return有兩個重要用途。第一,它使得內(nèi)含它的那個函數(shù)立即退出,也就是使程序返回到調(diào)用語句處繼續(xù)進(jìn)行。第二,它可以用來回送一個數(shù)值。本章將說明這兩個用途。
1. 從函數(shù)返回
函數(shù)可以用兩種方法停止運行并返回到調(diào)用程序。第一種是在執(zhí)行完函數(shù)的最后一個語句之后,從概念上講,是遇到了函數(shù)的結(jié)束符“ }”(當(dāng)然這個花括號實際上并不會出現(xiàn)在目標(biāo)碼中,但我們可以這樣理解)。例如,下面的函數(shù)在屏幕上顯示一個字符串。
[例4 - 2 ]
pr_reverse ()
{
char s[80]; / *定義一個字符數(shù)組* /
scanf("%s",s); / *輸入一個字符串,其長度不超過7 9個字符* /
printf("%s\n",s);
}
一旦字串顯示完畢,函數(shù)就沒事可做了,這時它返回到被調(diào)用處。
在實際情況中,沒有多少函數(shù)是以這種缺省方式終止運行的。因為有時必須送回一個值,大多數(shù)函數(shù)用return語句終止運行,有時在函數(shù)中設(shè)立了多個終止點以簡化函數(shù)、提高效率。切記,一個函數(shù)可以有多個返回語句。如下所示,函數(shù)在s1、s2相等時返回1,不相等時返回- 1。
[例4 - 3 ]
find_char(s1,s2)
char s1,s2;
{
if(s1 == s2)
return 1;
else
return -1;
}
2. 返回值
所有的函數(shù),除了空值類型外,都返回一個數(shù)值(切記,空值是A N S I建議標(biāo)準(zhǔn)所做的擴展,也許并不適合讀者手頭的C編譯程序)。該數(shù)值由返回語句確定。無返回語句時,返回值是0。這就意味著,只要函數(shù)沒有被說明為空值,它就可以用在任何有效的C語言表達(dá)式中作為操作數(shù)。這樣下面的表達(dá)式都是合法的C語言表達(dá)式。
x = power(y);
if(max (x,y) >100) printf("greater");