++ 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++;
包含以下两个子表达式++i
和i++
。 这些子表达式将按此顺序进行评估,因此这将转化为:
int j= 3 + 3;
与在Java和C#中一样, ++i
将被执行返回3
但我将在第二个i++
之前更改为3
。 第二个将返回i
的当前值,现在为3
,在i++
之后, i++
的值将为4
。
在C ++中,这将是未定义的。
在现实世界中,您不想输入此代码(代码打高尔夫球除外)