prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 5.3

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 页


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管