基本上,沒有人會將大段的C語言程式碼全部塞入 main() 函數,更好的做法是按照複用率高,耦合性低的原則,儘可能的將程式碼拆分不同的功能模組,並封裝成函數。C語言程式碼的組合千變萬化,因此函數的功能可能會比較複雜,不同的輸入,常常產生不同的輸出結果。
不同的輸入,常常產生不同的輸出結果
C語言函數可以通過返回值表示輸出結果,例如 log() 函數的返回值會根據不同的輸入,返回不同的值。再比如,我們定義一個函數 myopen(),用於開啓某個檔案,那麼,這個函數要麼能夠成功開啓檔案,要麼開啓檔案失敗,這時,可以通過返回值區分「成功」和「失敗」。
當然,myopen() 函數失敗的原因可能很多,但不是本文關注的重點,本文更關心的是,該以何值表示「成功」,何值表示「失敗」。按照C語言語法, 0 表示假,非零(常常用 1)表示真,那是否函數也用 0 返回值表示「失敗」,1 返回值表示「成功」呢?
C語言函數當然可以使用返回值 0 表示「失敗」,用返回值 1 表示「成功」。事實上,C語言函數用什麼樣的返回值表示成功或者失敗,只是一種人爲的約定,函數的呼叫者遵守這個「約定」就可以了。
C語言也有「行業潛規則」
不過,對於一般的函數,大多數C語言程式設計師常常使用返回值 0 表示成功,非零值表示失敗。因此,如果希望我們定義的函數能夠被大多數人愉快的使用,最好不要反其道而行,遵守「行業潛規則」更好一點。
仔細考慮下,其實C語言函數使用返回值 0 表示成功是有原因的。更一般的C語言函數返回值並不一定只有兩種可能值(成功/失敗),它可能還會返回對應錯誤原因的返回值,總之,函數成功只有一種可能,函數失敗卻有多種可能。
函數成功只有一種可能,函數失敗卻有多種可能
實數要麼是 0,要麼非 0,因此可以將 0 看作一個比較特殊的「唯一」數值,使用 0 這個「唯一」的返回值,表示唯一的「成功」,多種非零的返回值,表示多種原因的失敗,無疑更好一些。
當然,我們也可以說「實數要麼是 1,要麼非 1」,不過這顯然也不是「行業潛規則」。
例如我們可以規定,如果 myopen() 函數因爲「檔案或者目錄不存在」的原因失敗,返回 -1,如果因爲「許可權不夠」的原因失敗,則返回 -2。-1 和 -2 都是「非零值」,而成功作爲失敗的對立面,也即「非零值」的對立面,myopen() 函數使用返回值 0 表示成功無可厚非。
C語言程式設計師中還有一種「行業潛規則」
當然,C語言程式設計師中還有一種「行業潛規則」。如果定義的函數是個布爾函數,也即返回值顯式的使用類似於 bool 關鍵字定義,或者函數名類似於 is_true(),那麼顯然此時應該遵守C語言語法,使用「真」值表示成功,「假」值表示失敗。
if( is_true() )
printf("true\n");
請看上面這兩行C語言程式碼,顯然,遵守C語言語法的布爾函數更便於程式設計師寫出布爾判斷類的程式碼。
如果你也想學程式設計,可以來我的C語言/C++程式設計學習基地【點選進入】!
還有免費的(原始碼,零基礎教學,專案實戰教學視訊)!
涉及:遊戲開發、課程設計、常用軟件開發、程式設計基礎知識、駭客等等...
本文主要討論了C語言程式開發中關於函數返回值的問題。
可見,使用什麼樣的返回值表示成功,什麼用的返回值表示失敗,其實只是一種人爲約定。
只不過,如果希望我們編寫的程式碼能夠被大多數同行愉快的使用,最好遵守下「行業潛規則」。
當然了,若是希望我們的C語言程式碼應用性更廣,則可以使用<stdlib.h>標準標頭檔案裡預先定義好的 EXIT_SUCCESS 和 EXIT_FAILURE 宏。