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) |
参见问题 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)