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)