是!var与var!= NULL相同?

时间:2013-10-28 22:53:56

标签: c pointers null

如果!varvar != 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 }!

编辑:的确,我需要睡个好觉。我不知道我在想什么。谢谢大家!

6 个答案:

答案 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

!varvar == 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。