![](/img/trans.png)
[英]Does order of operators matter when using compound assignment in Java? (+= vs =+)
[英]Order of operations for compound assignment operators in Java
最近,我在一次模拟考试中碰到了以下内容,但对于为什么给出的答案是25、25(根据操作顺序)以及可能会在规范中缺少详细说明的原因,我有些困惑。
public class Test {
public static void main(String[] args) {
int k = 1;
int[] a = {1};
k += (k = 4) * (k + 2);
a[0] += (a[0] = 4) * (a[0] + 2);
System.out.println(k + " , " + a[0]);
}
}
仅看上面的第6行,我将替换为适当的值,并获得以下内容:
k = k + (k = 4) * (k + 2);
我首先评估括号,该括号表示k首先已分配给值4,然后又添加到了数字2,得出的总数为6。这就是我的解释方式:
k = k + 4 * 6;
现在,这变得令人困惑。 根据操作顺序,我得到以下信息,对于前面的表达式,这是正确的:
k = k + 24;
在我看来, k应该是4,因为这是新的赋值,但是答案实际上是25,而不是28。显然,复合运算符具有某些我不了解的优先顺序,或者我的替换原理不正确。
在这个答案中,我将仅考虑k
情况,对于数组来说是相同的。
int k = 1;
k += (k = 4) * (k + 2);
// k += (k = 4) * (k + 2)
// 1 += (k = 4) * (k + 2)
// 1 += 4 * (k + 2) with k = 4
// 1 += 4 * 6 with k = 4
// k = 25
这里的窍门:
k +=
在执行计算之前捕获k
的值。 +=
称为复合赋值运算符 。 引用JLS的相关部分:
保存左侧操作数的值,然后评估右侧操作数。
k = 4
返回分配的值,所以4。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.