天天看點

《C語言程式設計與實踐(第2版)》——2.7 函數

本節書摘來自華章出版社《c語言程式設計與實踐(第2版)》一書中的第2章,第2.7節,作者:淩雲等著,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視

c語言的程式是由一個個函數構成的,除了有且必須有的main主函數以外,使用者也可以自己定義函數。此外,c語言的編譯系統還提供了一些庫函數。函數為程式的封裝提供了一種簡便的方法,在其他地方使用函數時不需要考慮它是如何實作的。在使用正确設計的函數時不需要考慮“它是怎麼做的”,隻需要知道“它是做什麼的”就夠了。當定義好一個函數後,我們可以通過函數調用的方式來使用該函數的功能。

在上述示例中,所使用的函數(如cos、printf與scanf等)都是函數庫所提供的。接下來看看怎樣編寫自己的函數。我們通過編寫一個求階乘的函數factorial(int n)來說明定義函數的方法。

factorial(int n)函數用于計算整數n的階乘,比如factorial(4)的值為24。這個函數不是一個實用的階乘函數,它隻能用于處理比較小的整數的階乘,因為如果要求階乘的整數比較大,那麼使用該方法很容易越界,導緻程式無法獲得正确的結果。希望讀者讀完整本書以後,能為該問題找到正确的解決方法。

下面給出函數factorial(int n)的定義及調用它的主程式,由此可以看到引入函數後的整個程式結構,如例2-7所示。

例2-7 計算整數0~9的階乘。

函數定義的一般形式為:

傳回值類型 函數名(可能有的參數定義)

{

聲明和定義序列

語句序列

}

不同函數的定義可以按照任意次序出現在一個源檔案或多個源檔案中,但同一函數不能分開存放在幾個檔案中。如果源程式出現在幾個檔案中,那麼對它的編譯和裝入将比整個源程式放在同一檔案時要做的聲明更多,但這是作業系統的任務,而不是語言屬性。我們暫且假定兩個函數放在同一檔案中,進而使前面所學的有關運作c程式的知識在目前仍然有用。

在上述示例中,factorial函數定義的第一行int factorial(int n)聲明了參數的類型與名字以及該函數傳回的結果的類型。factorial的參數名隻能在factorial内部使用,在其他函數中不可見,是以在其他函數中可以使用與之相同的參數名而不會發生沖突。一般而言,把在函數定義中用圓括号括起來的變量稱為形式參數。

factorial函數計算得到的值由return語句傳回給main函數。關鍵詞return後可以跟任何表達式:

return 表達式;

函數不一定都傳回一個值。不含表達式的return語句用于使程式執行流程傳回調用者(但不傳回有用的值)。調用函數也可以忽略(不用)一個函數所傳回的值。讀者可能已經注意到,在main函數末尾也有一個return語句。由于main本身也是一個函數,它也可以向其調用者傳回一個值,這個調用者實際上就是程式的執行環境。一般而言,傳回值為0表示正常傳回,傳回值非0則表示引發異常或錯誤終止條件。

對函數的使用稱為函數調用。main主函數在如下程式語句中對factorial函數進行了調用:

<code>printf("%d的階乘是:%d\n", i, factorial(i));</code>

調用factorial函數時,傳送了一個變量i給它。一般把函數調用中與參數對應的值或變量稱為實際參數,如變量i,由實際參數傳遞值給形式參數。factorial函數則在調用執行完時傳回一個整數。在表達式中,factorial(i)就像i一樣是一個整數。

繼續閱讀