无法理解java算法中的执行顺序(k =和++ k)

Joe*_*len 8 java algorithm

我最近不得不做一个Java考试,并且想知道我遇到的一个问题.问题如下:

在没有任何参数的情况下运行以下代码将打印什么...

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);
    }

}
Run Code Online (Sandbox Code Playgroud)

答案是1到10之间的数字.我的原始答案是7,而他们说正确答案是6.

我的逻辑:

m1 sets k to 1, as it's ++i and thus gets incremented prior to returning.
then the += is unrolled, making: 'k = k + 3 + ++k'.
++k is executed, making k 2.
Replace the variables with their value: 'k = 2 + 3 + 2'
k = 7.
Run Code Online (Sandbox Code Playgroud)

但是,他们将其表示为k = 1 + 3 + 2.在执行++ k之前,有没有人可以解释为什么变量首先被替换?

Dav*_*vid 1

好的,您正确地指出 ++ 运算符优先于 += 运算符,因此在执行 ++ 操作之前,+= 不会展开......但是在执行任何操作之前,解释器首先评估大多数运算符的操作数,这是从左到右完成的。

所以在你的例子中,k = 1,

k += 3 + ++k;
Run Code Online (Sandbox Code Playgroud)

实际上是:

1 += 3 + ++k;
Run Code Online (Sandbox Code Playgroud)

然后 ++k 被评估,因为它具有优先级并变为:

1 += 3 + 2;
Run Code Online (Sandbox Code Playgroud)

+ 优先并变为:

1 += 5;
Run Code Online (Sandbox Code Playgroud)

此时 += 展开,这当然给出 6 ... QED

编辑

尽管运算符优先级很重要,但 Java 确实从左到右计算,除非优先级另有规定:

例如:

a + b + c * d

尽管c * d具有优先级,但不会首先评估。

a + b + c * d
  ^   ^
 these 2 operators compared
Run Code Online (Sandbox Code Playgroud)

两者具有相同的优先级,因此从左到右评估并a + b首先评估(我们称之为 result d)。

 d + c * d
   ^   ^
 next these 2 operators compared
Run Code Online (Sandbox Code Playgroud)

*优先于+所以c * d首先被评估。