请解释\u0026\u0026和||的优先级之间的明显冲突和表达式的实际结果

参见英文答案 > Precedence of && over ||                                    4个
我不明白以下程序的输出:

#include<stdio.h>

int main()
{
    int i=-3, j=2, k=0, m;
    m = ++i || ++j && ++k;
    printf("%d %d %d %d\n", i, j, k, m);
    return 0;
}

输出是-2 2 0 1而不是-2 3 1 1,这意味着在表达式j&& amp;之前评估了i(并导致||运算符使其右侧短路). k似乎与&&&运算符的优先级高于||.

有人解释原因吗?

表达方式:

++i || ++j && ++k

相当于:

(++i) || ((++j) && (++k))

解释:

>我被评估 – (-2)|| ((j)&&(k));
> ||操作符被评估 – (1);

从1 ||开始如果evalutes为true,则不评估右操作数.因此,&&优先权在这里无所谓.根据相关标准,C和C均可保证短路(见Is short-circuiting logical operators mandated? And evaluation order?).

现在,尝试使用子表达式,如下所示:

(++i || ++j) && ++k

这相当于:

((++i) || (++j)) && (++k)

解释:

>我被评估 – ((-2)||(j))&& (k);
> ||被评估 – (1)&& (k)
> k被评估 – (1)&& (1);
>评估真实;

https://stackoverflow.com/questions/3375041/please-explain-an-apparent-conflict-between-precedence-of-and-and-the-actu

转载注明原文:请解释\u0026\u0026和||的优先级之间的明显冲突和表达式的实际结果