主要是从字节码的角度去理解 ++
public void test(){
int i = 10;
int j = 20;
int a = i++;
int b = ++j;
}
代码对应的字节码指令
0 bipush 10
2 istore_1
3 bipush 20
5 istore_2
6 iload_1
7 iinc 1 by 1
10 istore_3
11 iinc 2 by 1
14 iload_2
15 istore 4
17 return
0:在操作数栈中push 一个值 10
2:从操作数堆栈中弹出值 10 并存储到局部变量表下标为1的地方(也就是i 的值)
3:在操作数栈中push 一个值 20
5:从操作数堆栈中弹出值 20 并存储到局部变量表下标为2的地方(也就是j 的值)
6:将局部变量表中下标为1处的局部变量的值(10)被压入操作数堆栈
7:局部变量表中索引为1处值 +1(此时局部变量表中i 的值为11)
10:从操作数堆栈中弹出值 10 并存储到局部变量表下标为3的地方(也就是a 的值)
11:局部变量表中索引为2处值 +1(此时局部变量表中j 的值为21)
14:将局部变量表中下标为2处的局部变量的值(21)被压入操作数堆栈
15:从操作数堆栈中弹出值 21 并存储到局部变量表下标为4的地方(也就是b 的值)
最后局部变量表中:
i:11
j:21
a:10
b:21
总结
a = i++表示先把i的值push操作数栈中,然后局部变量表中i进行自增操作,进行赋值操作,则表示将操作数栈中存的i的值(没有进行自增的值)赋值给a。
b = ++i表示先局部变量表中i进行自增操作,然后再将i的值push到操作数栈中,进行赋值操作,将操作数栈中存的i的值(进行了自增操作的值)赋值给b。
测试
public void test(){
int i = 10;
i = i++;
System.out.println(i);
}
此时i的值为多少呢?
0 bipush 10
2 istore_1
3 iload_1
4 iinc 1 by 1
7 istore_1
8 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;>
11 iload_1
12 invokevirtual #3 <java/io/PrintStream.println : (I)V>
15 return
输出打印的值为10。
push值为10到操作数栈中,
将10存放到局部变量表索引为1的地方(也就是i),
将i load到操作数栈中,
进行i自增(此时局部变量表中i的值为11,操作数栈中栈顶的值为10),
将操作数栈栈顶(10) 存放到局部变量表索引为1的地方(此时将之前的11进行了覆盖操作)
所以后面输出打印i 的值为10。