Java中复合赋值运算符的运算顺序

时间:2015-11-17 15:34:51

标签: 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.显然复合运算符有一些优先顺序我不是理解,或我的替代原则是不正确的。

1 个答案:

答案 0 :(得分:6)

在这个答案中,我只考虑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的值。 +=被称为compound assignment operator。引用JLS的相关部分:
      

    保存左侧操作数的值,然后评估右侧操作数。

  • k = 4返回指定的值,因此为4.