-->

在表达式中的Java复合赋值运算符优先级(Java Compound Assignment Oper

2019-10-18 10:50发布

当我尝试执行此下面的代码的输出被声明为“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);
}

}

Answer 1:

看看在行为JLS -复合赋值操作符 。 我在这里引用的相关两段,只是答案的完整性的原因:

否则左侧操作数的值保存 ,然后右手操作数进行评估。 如果这个评价突然完成,然后赋值表达式完成突然出于同样的原因,并没有发生转让。

否则, 左侧变量右手操作数的值 的保存的值被用来执行由化合物赋值操作符表示的二进制运算。 如果此操作突然完成,然后赋值表达式完成突然出于同样的原因,并没有发生转让。

重点煤矿。

所以,左手操作数先进行计算,它只需进行一次。 然后,左手操作数的评价值1在你的情况下,加入的右手操作数,其结果是的结果5 。 因此,结果6



Answer 2:

对运营商说,官方文件

除了赋值运算符所有二元运算符是从左向右计算; 赋值运算符评估从右到左。

所以, +评估left-to-right ,那里的赋值运算符评估right to left.

现在,你有你的答案吧??



文章来源: Java Compound Assignment Operator precedence in expressions