本節書摘來自華章計算機《編寫高品質代碼:改善c程式代碼的125個建議》一書中的第3章,建議18-1,作者:馬 偉 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
對于0值比較,看起來似乎很簡單,但實際情況并非如此,筆者曾經見過許多面試的程式員對此題的回答模棱兩可。下面,我們就來讨論一下如何正确地對各類型的資料進行0值比較。
布爾類型是計算機科學中的邏輯資料類型,它隻提供兩種原始值:true(真)和false(假)。通常情況下,零值為“假”,任意非零值都是“真”。
在c99的标準中,增加了一個内置的布爾類型_bool,可以存儲值1(true)和0(false)。同時,為了與c++相容,c99還在檔案中定義了宏bool、true與false,進而可以使程式員寫出c與c++互相相容的程式。
然而在c99之前(即c89中),c語言的标準并沒有提供布爾類型,但這不意味着c89就不能表示布爾值的概念。其實,c語言中的所有關系運算(>、>=、<、<=、==與!=)、邏輯運算(&&、||與!)以及條件聲明(if與while)等都以任意非零值代表true(真),零值代表false(假)。但是,任意非零值代表為true(真),這樣就會帶來了一個嚴重的問題,因為true由一個特定的值來表示,然而true的值究竟是什麼并沒有一個統一的标準。例如,在visual c++ 中将true定義為1,而在visual basic中則将true定義為-1。
是以,我們将布爾類型的比較代碼寫成如下形式顯然是不行的:
上面的代碼雖然看起來是正确的,但不具備很好的可移植性。當然,我們也可以通過宏定義的形式來寫成如下形式:
if( flag == true ) / 表示flag 為真/
if( flag == false ) / 表示flag 為假/
上面的代碼雖然可讀性較好,但同樣也會因為true或false的不同定義值而出錯。是以,正确的寫法應該如下:
這樣就避免了上面的所有可能,并且使代碼看起來也比較簡潔。