在 java 中递增顺序

increments order in java

为什么在 java 这个代码输出 1:

int bracketsTest = 0;
int resultBrackets = 1 + bracketsTest + bracketsTest++; // return 1

但是这会输出 2:

int bracketsTest = 0;
int resultBrackets = 1 + bracketsTest++ + bracketsTest; // return 2

我生活在两个片段应该相等的世界中,因为在两个结果中我们都执行以下操作:

  1. 1 + 0 + bracketsTest // bracketsTest = 0 我们在 bracketsTest++ 中放入零,之后 bracketsTest = 1
  2. 1 + 0 + 1 = 2 // 我们将 bracketsTest = 1 放在最后一个参数中
    但事实证明 increment/decrement 操作不是最高优先级操作? (因为我们在代码片段中放置括号测试很重要)

第二个加法表达式从左到右求值,如:

int resultBrackets = 1 + bracketsTest++ + bracketsTest;

1               (add 1)
bracketsTest++  (add zero, then increment bracketsTest by 1)
bracketsTest    (add 1, the current value of bracketsTest)

因此总和的计算结果为 2。

评价顺序

您似乎将 运算符优先级 计算顺序 混合在一起。请看一下 JLS§15.7. Evaluation Order:

The Java programming language guarantees that the operands of operators appear to be evaluated in a specific evaluation order, namely, from left to right.

还有:

The Java programming language guarantees that every operand of an operator (except the conditional operators &&, ||, and ? :) appears to be fully evaluated before any part of the operation itself is performed.

此外:

The Java programming language respects the order of evaluation indicated explicitly by parentheses and implicitly by operator precedence.

但这部分只有在您执行操作本身时才会起作用。在此之前,所有操作数都将被完全计算。


第一个片段

知道了这一点,我们就可以破译发生了什么。第一段:

1 + bracketsTest + bracketsTest++

首先会计算所有的操作数(从左到右),所以我们得到:

1. operand: 1
2. operand: 0
3. operand: 0 (and increment bracketsTest)

在计算第三个操作数时,它将递增 bracketsTest。现在,它会将所有内容加在一起,结果是 1 + 0 + 0 = 1


第二个片段

第二个片段:

1 + bracketsTest++ + bracketsTest;

也是从左到右计算的,所以我们有:

1. operand: 1
2. operand: 0 (and increment bracketsTest)
3. operand: 1 (because it was just incremented)

因此我们收到 1 + 0 + 1 = 2