1

由于这个帖子,混乱上升了。作者更新了帖子,结果一目了然。 结论:Java从左到右计算表达式

关闭!

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

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

但是我得到6作为输出,这迫使我重新思考从右到左的评估思路。请在这里解释这个理论。

4

8 回答 8

7

你得到 6 因为它是3 + 3

  • 第一个 OP 是首先++i递增(到 3)然后使用该值
  • 下一个 OP 是+i再次加 3
  • 最后一个 OP++不参与加法,但在使用后它会增加 i
于 2013-05-03T16:02:56.843 回答
7

你的假设是错误的。这是文档所说的:

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

所以

++i+i++

相当于

(++i)+(i++)

++i首先评估哪里。

这给

3+3

这是6(并且我在此之后具有价值4)。

于 2013-05-03T16:03:59.427 回答
3

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

于 2013-05-03T16:03:21.970 回答
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

所以总和是一样的,但是相加的项是不同的。

于 2013-05-03T16:10:12.010 回答
1

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

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

于 2013-05-03T16:03:36.800 回答
1

这是它的工作原理,因为一元运算符的优先级高于二元:

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.
于 2013-05-03T16:03:49.240 回答
1

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

int j=++i + i++;

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

int j= 3 + 3;

与在 Java 和 C# 中一样,++i将执行返回3但 i 将更改为3在第二个之前i++。第二个将返回iis 3now 和will be之后i++的当前值。i4

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

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

于 2013-05-03T16:04:02.897 回答
1

在评估诸如 的表达式时a+b,在将 'b' 添加到 'a' 之前,您需要知道 'a' 是什么。在这种情况下,a 是 ++i,即 3,b 是 i++,即 3。从右到左计算得到 3 + 3 = 6

于 2013-05-03T16:05:11.367 回答