6.3 用縮寫的指針比較 ``if(p)" 檢查空指針是否可靠? 如果空指針的內部表達不是 0 會怎麼樣?

當 C 在表達式中要求布爾值時, 如果表達式等於 0 則認為該值為假, 否則為真。換言之, 只要寫出
    if(expr)
無論 ``expr" 是任何表達式, 編譯器本質上都會把它當
    if((expr) != 0)
處理。

如果用指針 p 代替 ``expr" 則

    if(p) 等價於 if(p != 0)。
而這是一個比較上下文, 因此編譯器可以看出 0 實際上是一個空指針常數, 並使用正確的空指針值。這裡沒有任何欺騙; 編譯器就是這樣工作的, 並為、 二者生成完全一樣的代碼。空指針的內部表達無關緊要

布爾否操作符 ! 可如下描述:

!expr 本質上等價於 (expr)?0:1
  或等價於 ((expr) == 0)
從而得出結論
if(!p) 等價於 if(p == 0)
類似 if(p) 這樣的 ``縮寫", 儘管完全合法, 但被一些人認為是不好的風格 (另外 一些人認為恰恰是好的風格; 參見問題 17.8)。

參見問題 9.2

參考資料: [K&R2, Sec. A7.4.7 p. 204]; [ISO, Sec. 6.3.3.3, Sec. 6.3.9, Sec. 6.3.13, Sec. 6.3.14, Sec. 6.3.15, Sec. 6.6.4.1, Sec. 6.6.5]; [H&S, Sec. 5.3.2 p. 122]。

翻譯朱群英、孫雲, LaTeX2HTML 編譯 朱群英 (2005-06-23)