++ i + i ++评估

由于这篇文章,混乱上升了。 作者更新了他的post,结果变得清晰。 结论:Java 从左到右评估表达式

关闭!

由于表达式的评估是从右到左完成的,因此以下代码应该在j存储5

 int i=2; int j=++i+i++; System.out.println(j); 

但我得到6作为输出,这迫使我重新思考左右评价的想法。 请在这里解释一下理论。

 int i = 2; int j = ++i + i++; 

是相同的

 int i = 2; // This part is from ++i i = i + 1; int left = i; // 3 // This part is from i++ int right = i; // 3 i = i + 1; int j = left + right; // 3 + 3 = 6 

相反,如果你做了:

 int i = 2; int j = i++ + ++i; 

这相当于:

 int i = 2; // This part is from i++ int left = i; // 2 i = i + 1; // This part is from ++i i = i + 1; int right = i; // 4 int j = left + right; // 2 + 4 = 6 

所以总和是相同的,但总和的术语是不同的。

你得到6因为它是3 + 3

  • 第一个OP是++i ,它首先递增(到3)然后使用该值
  • 下一个OP是+i ,它再次增加3
  • 最后一个OP ++没有参与添加,但是在使用它之后它会增加

你的假设是假的。 这是文档说的内容:

除了赋值运算符之外的所有二元运算符都是从左到右计算的

所以

 ++i+i++ 

相当于

 (++i)+(i++) 

其中++i首先被评估。

这给了

 3+3 

这是6 (此后我的值为4 )。

第一个++增量i。 +将i添加到自身。 我是3岁。

你在哪里知道它从右到左? 这是从左到右。

Java中评估顺序的规则是什么?

这是如何工作的,因为一元运算符比二元运算符具有更多的先验:

 int i=2; int j =(++i)+(i++); ^^^ ^^^ 3 +(i++) //The value of i is now 3. ^^^ ^^^ 3 + 3 //The value of i is incremented after it is assigned. 

在评估诸如a+b类的表达式之前,在将’b’添加到’a’之前,您需要知道’a’是什么。 在这种情况下,a是++ i,它是3,b是i ++,它是3.从右到左评估给出3 + 3 = 6

在Java和C#中,子表达式的评估将从左到右进行:

 int j=++i + i++; 

包含以下两个子表达式++ii++ 。 这些子表达式将按此顺序进行评估,因此这将转化为:

 int j= 3 + 3; 

与在Java和C#中一样, ++i将被执行返回3但我将在第二个i++之前更改为3 。 第二个将返回i的当前值,现在为3 ,在i++之后, i++的值将为4

在C ++中,这将是未定义的。

在现实世界中,您不想输入此代码(代码打高尔夫球除外)