在这些代码行中,
void main()
{
if(!NULL)
{
printf("one.");
}
else
{
printf("two");
}
}
输出为1。这是为什么?为什么!NULL
是正确的?
答案 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 。因此,如果块正在执行,并且一个被打印。