3

我想知道 if is 是否与if is!var相同。var != NULLvarchar *

这是一个非常小的 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

编辑:确实,我需要睡觉。我不知道我在想什么。谢谢你们!

4

6 回答 6

5

!var相当于var==NULL

因此,您的第一个测试检查if (var == NULL). 您的第二次测试会检查与此相反的结果,因此会给您相反的结果。

运算符的这种行为!C11 6.5.3.3 一元算术运算符p5中进行了描述

逻辑否定运算符的结果!如果其操作数的值比较不等于 0,则为 0;如果其操作数的值比较等于 0,则为 1。

于 2013-10-28T22:55:13.800 回答
2

我想知道如果 var 是 char *, !var 是否与 var != NULL 相同。

!var相当于var == NULLifvar声明为对象指针类型(如char *)。

于 2013-10-28T22:56:10.857 回答
2

表达式为假!var时为真,在 C 中表示当比较等于时。varvar0

NULL等效于0在指针上下文中使用时。

因此,!var等价于var == NULL

于 2013-10-28T23:01:25.363 回答
1

(!c)并且(c != NULL)是两个相反的条件(如果一个为真,另一个为假)。

(!c)等价于 " if(c == 0)" 或 " if(c == NULL)",这是因为 c 初始化为 NULL。 (c != NULL)等效于 "if(c!=0)" 是 FALSE,因为 c 等于 NULL。

于 2013-10-29T13:32:43.890 回答
1

char *c = NULL初始化c指向NULL.

if(!c)评估if(!0)哪个是真的。

if(c != NULL)评估if(c != 0)哪个是假的。

于 2013-10-28T23:14:02.100 回答
1

!var is the same as var != NULL

!var是一样的var == NULL,不是!=。您的测试有缺陷,在这种情况下 -与, notif(c != NULL){相同。if (c) {if(!c){

然而,NULL这是一个可憎的 - 它通常通过宏定义处理,因此NULL在您的环境中可能具有完全不同的含义,这可能允许您的代码(如果按照您的意图编写)仍然显示您正在描述的内容。

于 2013-10-28T22:58:26.253 回答