// 代码
int i = 0;
i = i++; // 0
// 字节码
0 iconst_0 // 将0压栈
1 istore_1 // 将0存入本地变量表
2 iload_1 // 将0从局部变量表中取出
3 iinc 1 by 1 // 将局部变量表中第一个位置 加一
6 istore_1 // 将0存入本地变量表
7 return
// 代码
int i = 0;
i = ++i; // 1
// 字节码
0 iconst_0 // 将0压栈
1 istore_1 // 将0存入本地变量表
2 iinc 1 by 1 // 将局部变量表中第一个位置 加一
5 iload_1 // 将计算后的结果1,从局部变量表中取出
6 istore_1 // 将1存入本地变量表
7 return
- 不要使用
i = i++
!!!- 其先将计算前的变量压栈;
- 再在局部变量表中计算;
- 最后将栈中的值 赋值给 局部变量表的变量;
- 相当于计算了个寂寞,被计算前的值盖掉了;
- for循环i++、++i,因为无赋值动作,所以无差别;
- 这也就是我们所说的
i = i++
:先赋值,再计算;i = ++i
:先计算在赋值;
注:
- 其中0、1、2、5、6;这些代码行号,会被记录在程序计数器PC中;2到5行号不连续,是因为2包含了两个隐藏指令。