你真的理解i++和++i吗?

2019-07-21  本文已影响0人  Map_Reduce

代码1

public class TestAdd {
    public static void main(String[] args) {
        int i = 0;
        i = i++; 
        System.out.println("i = " + i);
    }
}

输出结果:i=0
明明进行i++了,但是输出结果为什么是0呢?
其实直接看代码,理解起来是比较抽象的,那么我们就一起来看看底层到底是怎么赋值的。
.class文件反编译后:

Code:
      stack=3, locals=2, args_size=1
         0: iconst_0
         1: istore_1
         2: iload_1
         3: iinc          1, 1
         6: istore_1
         7: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
        10: new           #3                  // class java/lang/StringBuilder
        13: dup
        14: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
        17: ldc           #5                  // String i =
        19: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        22: iload_1
        23: invokevirtual #7                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
        26: invokevirtual #8                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
        29: invokevirtual #9                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        32: return
      LineNumberTable:
        line 7: 0
        line 9: 2
        line 11: 7
        line 14: 32
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      33     0  args   [Ljava/lang/String;
            2      31     1     i   I

解释

0: iconst_0             //给变量i赋值为0
1: istore_1             //将i存储到Slot1(槽点)的位置
2: iload_1              //将Slot1位置上的i加载到栈顶
3: iinc        1, 1    //将Slot1位置上的i进行加1,此时进行的是i++操作,此时Slot1位置中的i变为1
6: istore_1            //又将栈顶的i=0 存储到了Slot1,所有Slot1位置中的i又从1变为了0
22: iload_1           //加载Slot1位置的i到栈顶,此时i=0

代码2

public class TestAdd {
    public static void main(String[] args) {
        int i = 0;
        i = ++i; 
        System.out.println("i = " + i);
    }
}

输出结果:i=1

.class文件反编译后:

 Code:
      stack=3, locals=2, args_size=1
         0: iconst_0
         1: istore_1
         2: iinc          1, 1
         5: iload_1
         6: istore_1
         7: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
        10: new           #3                  // class java/lang/StringBuilder
        13: dup
        14: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
        17: ldc           #5                  // String i =
        19: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
        22: iload_1
        23: invokevirtual #7                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
        26: invokevirtual #8                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
        29: invokevirtual #9                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
        32: return
      LineNumberTable:
        line 7: 0
        line 9: 2
        line 11: 7
        line 14: 32
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      33     0  args   [Ljava/lang/String;
            2      31     1     i   I

不解释了-_-.....

上一篇 下一篇

猜你喜欢

热点阅读