由于这个帖子,混乱上升了。作者更新了帖子,结果一目了然。 结论:Java从左到右计算表达式
关闭!
由于表达式的评估是从右到左完成的,因此以下代码应存储5
在j
:
int i=2;
int j=++i+i++;
System.out.println(j);
但是我得到6作为输出,这迫使我重新思考从右到左的评估思路。请在这里解释这个理论。
由于这个帖子,混乱上升了。作者更新了帖子,结果一目了然。 结论:Java从左到右计算表达式
由于表达式的评估是从右到左完成的,因此以下代码应存储5
在j
:
int i=2;
int j=++i+i++;
System.out.println(j);
但是我得到6作为输出,这迫使我重新思考从右到左的评估思路。请在这里解释这个理论。
你得到 6 因为它是3 + 3
:
++i
递增(到 3)然后使用该值+i
再次加 3++
不参与加法,但在使用后它会增加 i你的假设是错误的。这是文档所说的:
除了赋值运算符之外的所有二元运算符都是从左到右计算的
所以
++i+i++
相当于
(++i)+(i++)
++i
首先评估哪里。
这给
3+3
这是6
(并且我在此之后具有价值4
)。
第一个++
增量 i。将+
i 添加到自身。我是 3。
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
所以总和是一样的,但是相加的项是不同的。
你从哪里知道它是从右到左的?它是从左到右的。
这是它的工作原理,因为一元运算符的优先级高于二元:
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.
在 Java 和 C# 中,子表达式的计算将从左到右进行:
int j=++i + i++;
包含以下两个子表达式++i
和i++
. 这些子表达式将按此顺序进行评估,因此这将转换为:
int j= 3 + 3;
与在 Java 和 C# 中一样,++i
将执行返回3
但 i 将更改为3
在第二个之前i++
。第二个将返回i
is 3
now 和will be之后i++
的当前值。i
4
在 C++ 中,这将是未定义的。
在现实世界中,您不想输入此代码(代码打高尔夫球除外)
在评估诸如 的表达式时a+b
,在将 'b' 添加到 'a' 之前,您需要知道 'a' 是什么。在这种情况下,a 是 ++i,即 3,b 是 i++,即 3。从右到左计算得到 3 + 3 = 6