问题描述
int bracketsTest = 0;
int resultBrackets = 1 + bracketsTest + bracketsTest++; // return 1
但这输出 2:
int bracketsTest = 0;
int resultBrackets = 1 + bracketsTest++ + bracketsTest; // return 2
我生活在两个片段应该相等的世界中,因为在两个结果中我们都执行以下操作:
- 1 + 0 + 括号测试 // 括号测试 = 0 并且我们在括号测试++中放零,然后括号测试 = 1
- 1 + 0 + 1 = 2 // 我们将括号Test = 1 放在最后一个参数中
但事实证明递增/递减操作不是最高优先级操作? (因为我们在代码片段中放置括号测试的位置很重要)
解决方法
评估顺序
您似乎将运算符优先与求值顺序混合在一起。请查看JLS§15.7. Evaluation Order:
Java 编程语言保证运算符的操作数以特定的求值顺序进行求值,即从左到右。
还有:
Java 编程语言保证运算符的每个操作数(条件运算符 &&、|| 和 ? : 除外)似乎都在 操作本身的任何部分之前完全评估执行。
另外:
Java 编程语言尊重由括号显式指示并由运算符优先级隐式指示的求值顺序。
但该部分仅在您执行操作本身后才起作用。在此之前,所有操作数都将被完全评估。
第一个片段
知道了这一点,我们可以破译正在发生的事情。第一个片段:
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
。
第二个加法表达式从左到右计算,如下:
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。