一 前++ 和后++ 对比
1 前++代码
public void method6() {
int i = 10;
++i;
}
2 前++指令码
0 bipush 10
2 istore_1
3 iinc 1 by 1
6 return
3 后++代码
public void method6() {
int i = 10;
i++;
}
4 后++指令码
0 bipush 10
2 istore_1
3 iinc 1 by 1
6 return
5 结论
前++和后--最后生成的指令码一样,说明单独针对一个变量的前++和后++,没有任何区别。
for(int j = 0;j < 10;j++){}
也就是说,针对 j 的前++和后++,没有任何区别。
二 前++和后++赋值给一个变量
1 代码
public void method7() {
int i = 10;
int a = i++;
int j = 20;
int b = ++j;
}
2 指令码
0 bipush 10 // 操作数栈中栈顶元素为 10
2 istore_1 // 局部变量表中 i = 10
3 iload_1 // 操作数栈中栈顶元素为 10
4 iinc 1 by 1 // 局部变量表中 i = 11
7 istore_2 // 栈顶元素10存储到局部变量表中a的位置,所以a = 10
8 bipush 20 // 操作数栈中栈顶元素为 20
10 istore_3 // 局部变量表中 j = 20
11 iinc 3 by 1 // 局部变量表中 j = 21
14 iload_3 // 操作数栈中栈顶元素为 21
15 istore 4 // 栈顶元素21存储到局部变量表中b的位置,所以b = 21
17 return
三 后++赋值给自己
1 代码
public void method8() {
int i = 10;
i = i++;
System.out.println(i); // 10
}
2 测试结果
10
3 指令码
0 bipush 10 // 操作数栈中栈顶元素为 10
2 istore_1 // 局部变量表中 i = 10
3 iload_1 // 操作数栈中栈顶元素为 10
4 iinc 1 by 1 // 局部变量表中 i = 11
7 istore_1 // 将操作数栈中栈顶元素10 弹出,覆盖局部变量表中的i,所以 i = 10
8 getstatic #2 <java/lang/System.out>
11 iload_1
12 invokevirtual #5 <java/io/PrintStream.println>
15 return