表达式中的Java复合赋值运算符优先级

时间:2013-08-03 19:40:05

标签: java expression compound-assignment

当我尝试执行此操作时,以下代码的输出被声明为“6”。

当我试图通过这个时,表达式“k + = 3 + ++ k;应该被评估为k = k +(3 + ++ k);但是在这种情况下输出应该是7.看起来它被评估为k = k + 3 + ++ k;这导致6。

有人可以解释一下,为什么表达式被评估为“k + 3 + ++ k”而不是“k +(3 + ++ k);?

public class TestClass {

public static int m1(int i){
    return ++i;
}

public static void main(String[] args) {

    int k = m1(args.length);
    k += 3 + ++k;
    System.out.println(k);
}

}

2 个答案:

答案 0 :(得分:4)

查看JLS - Compound Assignment Operator中的行为。我在这里引用相关的两段,只是为了完整答案:

  

否则,保存左侧操作数的值,然后评估右侧操作数。如果此评估突然完成,则赋值表达式会因同样的原因而突然完成,并且不会发生任何分配。

     

否则,左侧变量的保存值右侧操作数的值用于执行复合赋值运算符指示的二进制运算。如果此操作突然完成,则赋值表达式会因同样的原因突然完成,并且不会进行赋值。

强调我的。

因此,首先评估左手操作数,并且只执行一次。然后,在您的情况下,左手操作数1的评估值与右手操作数的结果相加,结果为5。因此结果为6

答案 1 :(得分:0)

Official Docs on Operators says

  

除了赋值运算符之外的所有二元运算符都是从左到右计算的;赋值运算符从右到左进行求值。

因此评估+ left-to-right,其中评估赋值运算符right to left.

现在你的答案正确吗?