短路评估评估是否((a = 4)||(b = 6)||(c = 7)||(d = 8))

Jes*_*ada 1 c if-statement logical-operators

该计划发布如下:

#include <stdio.h>

int main(void)
{
    int a, b, c, d;

    printf("a = %d, b = %d, c = %d, d = %d\n", a, b, c, d);

    if( (a = 4) || (b = 6) || (c = 7) || (d = 8) )
        printf("a = %d, b = %d, c = %d, d = %d\n", a, b, c, d);
}
Run Code Online (Sandbox Code Playgroud)

我理解第一个printf语句但在第二个if语句中我不明白当只有一个等号而不是两个时它会评估什么.

输出是:

        a = 0, b = 0, c = 32767, d = -341260496
        a = 4, b = 0, c = 32767, d = -341260496
Run Code Online (Sandbox Code Playgroud)

所以第二个if语句最终是真的但是怎么样?
我认为一个等号将为变量赋值.

das*_*ght 5

我不明白如果只有一个等号而不是两个那么会评价.

一个等号使它成为一个任务.因此,a=4求值为4,逻辑"OR"运算符将其解释为"true" ||.此时由于短路没有进一步的评估,因此剩余的变量保留了它们在if语句之前的值.

注意:打印未分配的变量会导致未定义的行为.您应该更改声明行,如下所示:

int a = 0, b = 0, c = 0, d = 0;
Run Code Online (Sandbox Code Playgroud)