代码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
不解释了-_-.....
网友评论