C語言程序設(shè)計(第4章函數(shù))

字號:

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");