i++ 与 ++i 的区别

佚名 / 2024-07-08 / 原文

Java代码

package tmp;
public class Test {

    public static void main(String[] args) {
        f1();
        f2();
    }

    private static void f2() {
        int i = 0;
        int j = ++i;
        System.out.println(j);
    }

    private static void f1() {
        int i = 0;
        int j = i++;
        System.out.println(j);
    }
}

字节码,反编译工具luyten

class tmp.Test
    Minor version: 0
    Major version: 52
    Flags: PUBLIC, SUPER
    
    public void <init>();
        Flags: PUBLIC
        Code:
                  linenumber      3
               0: aload_0         /* this */
               1: invokespecial   java/lang/Object.<init>:()V
               4: return         
    
    public static void main(java.lang.String[] args);
        Flags: PUBLIC, STATIC
        Code:
                  linenumber      6
               0: invokestatic    tmp/Test.f1:()V
                  linenumber      7
               3: invokestatic    tmp/Test.f2:()V
                  linenumber      8
               6: return         
    
    private static void f2();
        Flags: PRIVATE, STATIC
        Code:
                  linenumber      11
               0: iconst_0       
               1: istore_0        /* i */
                  linenumber      12
               2: iinc            i, 1
               5: iload_0         /* i */
               6: istore_1        /* j */
                  linenumber      13
               7: getstatic       java/lang/System.out:Ljava/io/PrintStream;
              10: iload_1         /* j */
              11: invokevirtual   java/io/PrintStream.println:(I)V
                  linenumber      14
              14: return         
    
    private static void f1();
        Flags: PRIVATE, STATIC
        Code:
                  linenumber      17
               0: iconst_0       
               1: istore_0        /* i */
                  linenumber      18
               2: iload_0         /* i */
               3: iinc            i, 1
               6: istore_1        /* j */
                  linenumber      19
               7: getstatic       java/lang/System.out:Ljava/io/PrintStream;
              10: iload_1         /* j */
              11: invokevirtual   java/io/PrintStream.println:(I)V
                  linenumber      20
              14: return