- 无赋值操作的a++
int a = 1;
a++;
System.out.println(a); // a = 2
字节码:
0 iconst_1 // 把1入栈
1 istore_1 // 把栈中的1放到常量表的第一个位置并赋值给a(a = 1)
2 iinc 1 by 1 // 在常量表下标为1的值自增1,此时常量表中的a为2
5 getstatic #2 <java/lang/System.out>
8 iload_1 // 把常量表下标为1的压入操作栈
9 invokevirtual #3 <java/io/PrintStream.println>
- 赋值操作的a++
int a = 1;
a = a++;
System.out.println(a); // a = 1
字节码:
0 iconst_1
1 istore_1
2 iload_1 // 把常量表下标为1的值压入操作栈
3 iinc 1 by 1 // 在常量表下标为1的值自增1,此时常量表中的a为2
6 istore_1 // 把操作栈中的值赋值给常量表下标为1的值,此时常量表中的a依然为1
7 getstatic #2 <java/lang/System.out>
10 iload_1
11 invokevirtual #3 <java/io/PrintStream.println>
- 赋值操作的++a
int a = 1;
a = ++a;
System.out.println(a); // a = 2
字节码:
0 iconst_1
1 istore_1
2 iinc 1 by 1 // 把常量表下标为1的值自增加一,此时常量表中的a为2(a = 2)
5 iload_1 // 把常量表下标为1的值压入操作栈,此时栈顶的a = 2
6 istore_1 // 把栈顶的值赋值给常量表下标为1的值,此时a = 2
7 getstatic #2 <java/lang/System.out>
10 iload_1
11 invokevirtual #3 <java/io/PrintStream.println>
第二和第三个示例可以看出a++
和++a
是把iinc 1 by 1
和iload_1
顺序调转,就造成了赋值操作时输出值的区别。