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

为什么在C中if-else条件中传递(!NULL)为真?,c,if-statement,null,C,If Statement,Null,在这些代码行中 void main() { if(!NULL) { printf("one."); } else { printf("two"); } } 输出为1。为什么呢?为什么是!NULLtrue?NULL是与0等效的指针。0在C中为假,任何其他非零值为正 因此如果!(非运算符)应用于NULL(false),这意味着!NULL为true 因此,if条件满足为真,并打印“一”。来自C标准#6.3.2.3p3[强

在这些代码行中

void main()
{
   if(!NULL)
     {
       printf("one.");
     }
   else
     {
       printf("two");
     }
}

输出为1。为什么呢?为什么是
!NULL
true?

NULL是与0等效的指针。0在C中为假,任何其他非零值为正

因此如果!(非运算符)应用于NULL(false),这意味着!NULL为true

因此,if条件满足为真,并打印“一”。

来自C标准#6.3.2.3p3[强调添加]

3值为0的整型常量表达式,或转换为类型
void*
,称为空指针常量。66)如果将空指针常量转换为指针类型,则生成的指针称为空指针,保证与指向任何对象或函数的指针进行比较

..

66)宏NULL
(和其他标题)中定义为空指针常量;见7.19

来自C标准#6.5.3.3p5

5逻辑求反运算符的结果!如果其操作数的值比较不等于0,则为0;如果其操作数的值比较等于0,则为1。结果的类型为int。表达式为!E等于(0==E)

那么这个声明,

if(!NULL)
相当于

if (0==NULL)
0==NULL
的计算结果为
true
。因此,您将获得输出
one


其他:

main()
void
返回类型不符合标准。相反,您应该使用
int
作为
main()
的返回类型,简而言之:-

根据C编码标准

非零值等于
ZeroNULL等同于FALSE

因此,(!NULL)等同于TRUE。因此,如果块正在执行并且打印了一个