我的疑问是为什么在以下代码中输出分别为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)


使用新的递增值。



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

07-28 13:47