Q缩写的指针比较“if(p)”用于检查非空指针是否有效?如果空指针的内部表示不是零呢?
A它始终是有效的。
当 C 语言要求表达式的布尔值时,如果表达式与零相等,则推断为假值,否则为真值。也就是说,每当有人写
if(expr)其中“expr”是任何表达式,编译器实际上就像写成
if((expr) != 0)将简单的指针表达式“p”替换为“expr”,我们得到
if(p) is equivalent to if(p != 0)这是一个比较上下文,所以编译器可以知道(隐式的)0实际上是空指针常量,并使用正确的空指针值。这里没有技巧;编译器就是这样工作的,并且为这两种结构生成相同的代码。空指针的内部表示无关紧要。
布尔否定运算符,!,可以描述为
!expr is essentially equivalent to (expr)?0:1 or to ((expr) == 0)由此得出结论,
if(!p) is equivalent to if(p == 0)
“缩写”例如if(p),虽然完全合法[脚注],但一些人认为风格不佳(另一些人则认为风格好;请参阅问题17.10)。
另请参阅问题9.2。
参考文献:K&R2 第 A7.4.7 节,第 204 页
ISO 第 6.3.3.3、6.3.9、6.3.13、6.3.14、6.3.15、6.6.4.1、6.6.5 节
H&S 第 5.3.2 节,第 122 页