1

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

}

4

2 回答 2

4

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

否则,将保存左侧操作数的值,然后计算右侧操作数。如果这个求值突然完成,那么赋值表达式也会因为同样的原因而突然完成并且没有赋值发生。

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

强调我的。

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

于 2013-08-03T19:47:23.917 回答
0

关于运营商的官方文档说

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

So +被评估left-to-right,其中 as 赋值运算符被评估right to left.

现在你的答案是对的吗??

于 2013-08-03T19:45:37.030 回答