操作员优先级错误

时间:2015-09-03 22:48:27

标签: java c#

考虑以下伪代码:

int x = 10;
int y = 10;

x = x + x++;
y = y++ + y;

print(x); // 20
print(y); // 21
像C#或Java这样的类C编程语言说增量优先于+运算符。所以在两种情况下都应该是21

为什么会打印两种不同的结果?

3 个答案:

答案 0 :(得分:7)

请记住,我们从左到右工作。

让我们首先处理x然后y。

X

x = x + x ++;

我们从左到右......

x = 10 +(10 ++)

注意:当我们从左到右时,最右边x上的后增量运算符对首先出现在RHS上的x没有影响。

x = 20

ý

y = y ++ + y;

y = 10 ++ + 11;

我们再次从左向右,增量运算符post将y从10增加到11,因此最右边的y变为11,因此产生(10 + 11)= 21。

答案 1 :(得分:0)

我认为+运算符的优先级高于++,因此首先评估+运算符,但为了对其进行求值 - 它必须评估左右运算符它

在第二个示例中,首先计算左侧运算符,以便在评估右侧之前y递增。

Precedence and Order of Evaluation文档中,您可以看到+高于+=,这基本上是+++上方是前缀 ++,不得与后缀 ++混淆。

答案 2 :(得分:0)

评估y++ + y时,会在y++之前评估y。因此,左侧评估为10,右侧将由于先前的增量而评估为11。 评估x + x++时,x之前会评估x++。因此,双方将被评估为10,然后x将在=操作数将x评估为20之前评估为11。