带有方法调用的表达式中的Java后缀操作符优先级



我的疑问是为什么在下面的代码中输出分别是2和1 ?这样真的可以吗?在我看来,方法'm'应该接收值1,因为它在变量'i'上使用后缀操作符而不是前缀操作符。

public class PostfixDoubt {
    public static void main(String[] args) {
        int i = 1;
        // why does m receive 2 as argument and not 1?
        i = i++ + m(i);
        System.out.println(i);
    }
    public static int m(int i) {
        System.out.println(i);
        return 0;
    }
}

下面是javap反编译的字节码:

public class PostfixDoubt {
  public PostfixDoubt();
    Code:
       0: aload_0
       1: invokespecial #8                  // Method java/lang/Object."<init>":()V
       4: return
  public static void main(java.lang.String[]);
    Code:
       0: iconst_1
       1: istore_1
       2: iload_1
       3: iinc          1, 1
       6: iload_1
       7: invokestatic  #16                 // Method m:(I)I
      10: iadd
      11: istore_1
      12: getstatic     #20                 // Field java/lang/System.out:Ljava/io/PrintStream;
      15: iload_1
      16: invokevirtual #26                 // Method java/io/PrintStream.println:(I)V
      19: return
  public static int m(int);
    Code:
       0: getstatic     #20                 // Field java/lang/System.out:Ljava/io/PrintStream;
       3: iload_0
       4: invokevirtual #26                 // Method java/io/PrintStream.println:(I)V
       7: iconst_0
       8: ireturn
}

此操作

i++

增加存储在i变量中的值,并返回之前的值。当i被重新求值作为参数传递给

m(i)

使用新的加1后的值。


int i = 1;
i = i++ + m(i);

的样子

1: 1 (i = 2) + m(i)
2: 1 (i = 2) + m(2)
3: 1 (i = 2) + Whatever value m(2) returns
4: whatever value is the result of that addition
5: that value is assigned to i

最新更新