根据C规范:
值为0的整型常量表达式或此类表达式
所以0
是一个空指针常量.如果我们将其转换为指针类型,我们将得到一个空指针,对于某些体系 struct ,它可能不是所有位零.接下来,让我们看看规范中关于比较指针和空指针常量的说明:
如果一个操作数是
让我们考虑(p == 0)
:首先将0
转换为空指针,然后将p
与其实际位值依赖于体系 struct 的空指针常量进行比较.
接下来,看看规范对否定操作符有什么规定:
逻辑求反运算符的结果!如果其
这意味着(!p)
相当于(p == 0)
,根据规范,这是根据机器定义的空指针常数测试p
.
因此,即使在NULL指针常量不是全位零的体系 struct 上,也可以安全地写入if (!p)
.
对于C++,空指针常量定义为:
空指针常量是整型常量表达式(5.19)
这接近于C,加上nullptr
个语法.操作员==
的行为定义如下:
此外,可以比较指向成员的指针或指向
这将导致将0
转换为指针类型(如C).对于否定运算符:
逻辑求反运算符的操作数!这是语境
这意味着!p
的结果取决于如何执行从指针到bool
的转换.标准说:
可以使用零值、空指针值或空成员指针值
因此,if (p==NULL)
和if (!p)
也在C++中做同样的事情.