1、结论
- i++是先将数字加载到操作数栈进行其他运算,然后再将局部变量槽中的变量值加一
- ++i是先在局部变量槽中将该变量的值加一,然后再将这个局部变量槽中的值加载到操作数栈进行其他运算。
2、简单的示例代码
public static void main(String[] args) {
int i = 0;
int j = i++;
int k = ++i;
System.out.println("j = " + j + ", k = " + k);
}
3、对应的字节码
Code:
stack=3, locals=4, args_size=1
// ①、i变量赋值(先准备一个常量0,然后将0放入到一号局部变量槽)
0: iconst_0
1: istore_1
// ②、j = i++
// 将一号变量槽中的数字加载到操作数栈
2: iload_1
// 将一号变量槽中的变量+1(注意:iinc是在变量槽中加一的)
3: iinc 1, 1
// 将操作数栈中的数字放到二号变量槽(也就是 j = i++)
6: istore_2
// ③、K= ++i;
// 将一号局部变量槽中的值加一(iinc直接在变量槽中相加)
7: iinc 1, 1
// 将一号局部变量的变量加载到操作数栈
10: iload_1
// 将操作数栈中的数据赋值给三号变量槽
11: istore_3
LocalVariableTable:
Start Length Slot Name Signature
0 47 0 args [Ljava/lang/String;
2 45 1 i I
7 40 2 j I
12 35 3 k I
4、图解
①、i = 0
iconst_0指令 & istore_1指令