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

时间:2019-03-07 04:22:18

标签: c if-statement null

在这些代码行中,

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

输出为1。这是为什么?为什么!NULL是正确的?

3 个答案:

答案 0 :(得分:7)

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

  

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

     

....
  ....

     

66) NULL <stddef.h>(和其他标头)中定义为空指针常量;见7.19。

来自C Standard#6.5.3.3p5

  

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

所以,这句话

if(!NULL)

等效于

if (0==NULL)

0==NULL被评估为true。因此,您将获得输出one


其他:

void的{​​{1}}返回类型不符合标准。相反,您应该使用main()作为int的返回类型。

答案 1 :(得分:2)

NULL是等于0的指针。在C中0为false,其他任何非零值均为正。

如果将!(非运算符)应用于NULL(false),则表示!NULL为true。

因此满足if条件的条件为true和“ 1”。已打印。

答案 2 :(得分:1)

简而言之:-

根据 C编码标准

  

非零值等于 TRUE   
NULL 等同于 FALSE

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