为什么在if-else条件下传递(!NULL)在C中为true?

San*_*ire 2 c null if-statement

在这些代码行中,

void main()
{
   if(!NULL)
     {
       printf("one.");
     }
   else
     {
       printf("two");
     }
}
Run Code Online (Sandbox Code Playgroud)

输出为一。这是为什么?为什么是!NULL真的?

H.S*_*.S. 7

来自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()