关于C#:表达式如何求值?

How the expression evaluates?

本问题已经有最佳答案,请猛点这里访问。

有人可以画出表达式的优先级树,请解释一下用C进行表达式求值后的副作用。.

1
2
int i=-3, j=2, k=0, m;
m= ++i || ++j&&++k;

根据我的输出应该是-2 3 1 1但我的gnu c编译器打印的是-2 2 0 1?
我想知道如何?


因为j由于短路评估而无法评估:

1
2
m= ++i || ++j && ++k;
    ↑

在此阶段,无论||的右侧如何,m的值都已被评估为1。为什么?

因为1 || anything是1.


C中的&&||运算符发生短路。这意味着,如果它们左侧的值足以确定总值,则永远不会评估右侧。

您的表达式被解析为(++i) || ((++j)&&(++k))||短路,因此在评估了++i之后,发现其值是-2(一个true值),就不再评估该表达式了。