A: 它总是正确的。
当C要求一个表达式的布尔值时,表达式等于0时会推断出一个false值,等于其它值会推断出一个true值。即是,不论何时一个人写
if(expr)
此处“expr”是任意表达式,编译器本质上表现得如同那行代码是这样写
if((expr) != 0)
用通常的指针表达式“p”代替“expr”,我们得到
if(p) 等同 if(p != 0)
这是一个比较上下文,所以编译器知道(隐含的)0实际上是一个null指针常量,并使用正确的null指针值。这里不存在什么窍门;编译器就是这样工作的,并为两种代码生成相同的代码。一个null指针的内部表示并不重要。
布尔非运算符 ! 可以被如下描述:
!expr 等同 (expr)?0:1 或 ((expr) == 0)
这得出结论
if(!p) 等同 if(p == 0)
类似 if(p) 这样的“简化”,尽管完全合法,却被一些人认为是不好的风格(其他人认为是良好的风格;参见问答17.10)。
同时参见问答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
(This Chinese translation isn't confirmed by the author, and it isn't for profits.)
Translator : jhlicc@gmai1.c0m
Origin : http://www.c-faq.com/null/ptrtest.html