为什么把最后的num1、num2、0赋值给if块,else块就执行了?

Why else block is executed if num1, num2, and 0 at the end is assigned to if block?

在此代码中

#include <stdio.h>
int main(){
    int i;

    if(i= 50,40)
        printf(" if blk i %d\n",i);
    else
        printf(" else part" );



    return 0;
}

输出结果为

if blk i 50

但是如果if语句的赋值部分加了0,就会转到else部分。为什么这个 0 会转到其他部分?

下面的代码:

#include <stdio.h>
int main(){
    int i;

    if(i= 50,40,0)
        printf(" if blk i %d\n",i);
    else
        printf(" else blk i %d\n", i);

    printf("i %d\n", i);

    return 0;
}

您正在使用 逗号运算符。使用此运算符的表达式的值为右侧的值。

在这种情况下:

(i= 50,40)

i 首先设置为 50,然后计算值 40,因此表达式的值为 40。因为这是一个非零值,所以它在布尔上下文中计算为真并输入if 部分。

在这种情况下:

(i= 50,40,0)

发生与上面相同的情况,但随后计算 0,因此表达式的值为 0。零在布尔上下文中计算为 false,因此它进入 else 部分。

这条语句:

if(i= 50,40)

实际上是:

if(40)

逗号运算符首先将 i 分配给 50(逗号运算符的优先级低于赋值),然后作为条件使用最后一个元素,即 40

but when a zero is added to the assignment part in if statement, it goes to the else part.

因为作为条件,使用了最后一个元素,即 00 导致 if 失败,并执行 else 块。

表达式 a, b 首先计算 a 并丢弃结果。
然后计算 b,该值是表达式的结果。

i= 50,40 首先计算 i = 50 然后产生 40 作为结果。
由于 40 不是 0,因此它被转换为 true 作为条件。

i = 50, 40, 0 计算 i = 50,然后计算 40,然后计算 0,它成为表达式的值。
0 转换为 false

另一方面,

i = (50,40) 会将 40 分配给 i 并完全忽略 50