在 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 + 0 + bracketsTest // bracketsTest = 0 我们在 bracketsTest++ 中放入零,之后 bracketsTest = 1
- 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
。
为什么在 java 这个代码输出 1:
int bracketsTest = 0;
int resultBrackets = 1 + bracketsTest + bracketsTest++; // return 1
但是这会输出 2:
int bracketsTest = 0;
int resultBrackets = 1 + bracketsTest++ + bracketsTest; // return 2
我生活在两个片段应该相等的世界中,因为在两个结果中我们都执行以下操作:
- 1 + 0 + bracketsTest // bracketsTest = 0 我们在 bracketsTest++ 中放入零,之后 bracketsTest = 1
- 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
。