San*_*ire 2 c null if-statement
在这些代码行中,
void main()
{
if(!NULL)
{
printf("one.");
}
else
{
printf("two");
}
}
Run Code Online (Sandbox Code Playgroud)
输出为一。这是为什么?为什么是!NULL
真的?
来自C Standard#6.3.2.3p3 [添加了重点]
3 值为0的整数常量表达式,或将这种类型强制转换为类型的表达式
void *
,称为空指针常量。66)如果将空指针常量转换为指针类型,则保证生成的指针(称为空指针)将不相等的值与指向任何对象或函数的指针进行比较。....
....66)在(和其他头文件中)宏NULL被定义为空指针常量;见7.19。
<stddef.h>
从C Standard#6.5.3.3p5
5逻辑求反运算符的结果!如果其操作数的值比较不等于0,则为0;如果其操作数的值比较等于0,则为1。结果的类型为int。表达式!E等效于(0 == E)。
所以,这句话
if(!NULL)
Run Code Online (Sandbox Code Playgroud)
相当于
if (0==NULL)
Run Code Online (Sandbox Code Playgroud)
0==NULL
评估为true
。因此,您将获得output one
。
额外:
的void
返回类型main()
不符合标准。相反,您应该使用的int
返回类型main()
。