部落格園cnblogs不知為何最近開始漸有C語言開發重啟的跡象,不少人開始寫一些C語言的教程。
其中看到一段有趣的留言,提到這個寫法:if (p == NULL),
有人說這是不好的~,經典不提倡的~,會寫錯出問題的~,華為都禁止的~。
我倒是有些不同的看法。
首先這種寫法是有問題,一般來講對於null 指標可以這樣寫
if ( p )
或者反義是這樣 if ( !p )
既簡單,還節省字數。
如果是想寫的比較容易懂,那麼if (p == NULL) 是我提倡的方式。
你可以很簡單的讀成“如果p等於空值”,反過來的方式NULL==p就有些彆扭,不是給人看的。
有人提到p==NULL很容易寫成p=NULL,代碼出錯啦!會有bug啦!
好吧,我承認這是一種可能性,在早期編譯器不完善的時候的確如此。那時候還提倡用匈牙利命名法,因為編譯器對類型識別支援不好,很容易寫出胡亂轉型的代碼(當然現在的C語言也容易)。但是針對正在使用的編譯器以及將來更先進的編譯器,在條件判斷中使用p==NULL不是問題。
做一個很簡單的實驗,使用VC2010,項目設定為compile as C,注意關鍵一點“把warning層級提高到最進階別4”,這時候if (p=NULL
)會得到如下警告:
1>purec.cpp(10): warning C4706: assignment within conditional
expression
很簡單吧,不需要你使用那種反人類常識的代碼規範。
使用GCC(v4.5.2 in Ubuntu11.4)也很容易,它有一個編譯選項-Wall,警告資訊如下:
/home/sun/foobar-sample/main.c:24:2: warning: suggest parentheses around
assignment used as truth value
如果工具支援,為何不使用一種更為合乎閱讀習慣的方式呢,BTW,我尋找了一下經典的K&R,其中==的使用都是我提到的p==0這種方式,其它更為經典的(有嗎?)我就不知道了。