繁体   English   中英

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

[英]Java Compound Assignment Operator precedence in expressions

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

}

看看JLS中的行为- 复合赋值运算符 我在这里引用相关的两段,只是为了答案的完整性:

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

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

强调我的。

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

关于运营商的官方文件说

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

所以+ left-to-right进行评估,其中赋值运算符right to left.进行计算right to left.

现在你的答案正确吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM