如果!var
为var != NULL
,我想知道var
是否与char *
相同。
这是一个非常小的POC,它表明它不是一回事(或者我做错了什么?)但我不明白为什么。
int main(void) {
char *c = NULL;
if(!c){
printf("1\n");
}else{
printf("2\n");
}
if(c != NULL){
printf("1\n");
}else{
printf("2\n");
}
return 0;
}
输出
1
2
我在x64 Arch Linux,GCC 4.8.2上运行它
编辑:要么我需要一些真正的睡眠,要么你们都误读了程序的实际输出!请阅读几次。
!c
表示“如果c
不为NULL”,这是假的,因此它应该在第一个2
中打印if
,但它会打印1
}!
答案 0 :(得分:5)
!var
相当于var==NULL
。
因此,您的第一次测试会检查if (var == NULL)
。你的第二次测试检查了相反的结果,所以给你相反的结果。
{em> C11 6.5.3.3一元算术运算符 p5
中描述了!
运算符的这种行为。
逻辑否定运算符的结果!如果是它的值则为0 操作数比较不等于0,1如果其操作数的值比较则为1 等于0。
答案 1 :(得分:2)
如果我想知道如果var是char *,那么!var是否与var!= NULL相同。
!var
声明为对象指针类型(如var == NULL
),则 var
等效于char *
。
答案 2 :(得分:2)
只要!var
为false,表达式var
就为真,在C中表示var
与[{1}}的比较等于。{/ p>
0
在指针上下文中使用时等同于NULL
。
因此,0
相当于!var
。
答案 3 :(得分:1)
!var is the same as var != NULL
!var
与var == NULL
相同,而非!=
。您的测试存在缺陷,在这种情况下,if(c != NULL){
与if (c) {
相同,而不是if(!c){
。
然而,NULL
是令人厌恶的 - 它通常是通过宏定义来处理的,因此NULL
可能在您的环境中具有完全不同的含义,这可能允许您的代码(如果按照您的意图编写) ),以显示你仍在描述的内容。
答案 4 :(得分:1)
char *c = NULL
将指针c
初始化为NULL
。
if(!c)
评估为if(!0)
,这是真的。
if(c != NULL)
评估为if(c != 0)
,这是错误的。
答案 5 :(得分:1)
(!c)
和(c != NULL)
是两个相反的条件(如果一个是真的,另一个是假的)。
(!c)
相当于“if(c == 0)
”或“if(c == NULL)
”,这是真的,因为c初始化为NULL。
相当于“if(c!= 0)”的(c != NULL)
为FALSE,因为c等于NULL。