前面說過,學習 C 語言有兩個知識點是必須要學的,一個是函數,另一個是指標,這兩個知識點是 C 語言的主體和核心。由此可見,學習函數的重要性,所以初學者一定要好好學。
什麼是函數
第一,函數就是 C 語言的模組,一塊一塊的,有較強的獨立性,可以相互呼叫,換句話說,C 語言中,一個函數裡面可以呼叫 n 個函數,即大函數呼叫小函數,小函數又呼叫“小小”函數。這就是結構化程式設計,所以程序導向的語言又叫結構化語言。
第二,函數就是一系列 C 語句的集合,能完成某個特定的功能。需要該功能的時候直接呼叫該函數即可,不用每次都堆疊程式碼。需要修改該功能時,也只需要修改和維護這一個函數即可。
為什麼需要函數
第一,將語句集合成函數的好處是方便程式碼重用。所謂“重用”,是指有一些程式碼的功能是相同的,操作是一樣的,只不過針對的資料不一樣,這時就可以將這種功能寫成一個函數模組,以後用到這個功能時只需要呼叫這個函數模組就可以了,不需要再重複地編寫同樣的程式碼。這樣可以解決大量同型別的問題,避免重複性操作。
第二,將語句集合成函數方便程式碼的維護。哪個功能出問題了,或者需要修改某個功能,那就只需要修改某個功能的函數就可以了。
所以,函數有利於程式的模組化。這實際上就是程序導向的思想。程序導向語言最基本的單位不是語句,而是函數。
庫函數和自定義函數
前面各章中,程式大都只有一個主函數 main(),但是在實際程式設計中程式往往是由多個函陣列成的。
C 語言不僅提供了極為豐富的庫函數(幾百個),還允許使用者定義自己的函數。使用者可以將自己的演算法編成一個個相對獨立的函數模組,然後通過呼叫來使用這些函數。在實際的C程式設計中用得最多的就是自己定義的函數。庫函數只能提供一些基本的功能,我們所需要的大多數功能還是需要自己寫。
不僅如此,在將來要學習的很多語言中,比如 Labview,這些公司在開發這些語言的時候就已經將所有需要用到的函數都模組化了,不再需要自己動手編寫模組內部的程式。我們只需要呼叫這些模組程式設計即可,這樣大大提高了程式設計的效率,簡化了偵錯的難度。我們甚至不需要知道各個模組內部的程式到底是怎麼編寫的,我們只需要知道怎麼用就行了。
函數的呼叫
可以說,C 程式的全部工作都是由各式各樣的函數完成的。由於採用了函數模組式結構,所以C語言易於實現結構化程式設計,使程式的層次結構清晰,便於程式的編寫、閱讀和偵錯。
在 C 語言中,所有函數的定義,包括主函數 main 在內,都是“平行”的。也就是說,在一個函數的函數體內,不能再定義另一個函數,即不能巢狀定義。但是函數之間允許相互呼叫,也允許巢狀呼叫。習慣上將呼叫者稱為
主調函數,被呼叫者稱為
被調函數。函數還可以自己呼叫自己,稱為
遞回呼叫。
此外,main 函數是主函數,它可以呼叫其他函數,但不允許被其他函數呼叫。C 程式的執行總是從 main 函數開始的(也是由 main 結束的),就算定義的函數放在 main 的前面,程式仍然從 main 開始執行。如果執行到函數呼叫則執行被呼叫的函數,完成函數呼叫後再返回到 main 函數繼續往下執行,最後由 main 函數結束整個程式。一個 C 語言程式必須有且僅有一個主函數 main。