关于a++和++a
java 学习之路
int a = 10;
int b = a++ + ++a + a-- + --a;
System.out.println(a);
System.out.println(b);
输出结果为:
10
44
使用 javap -v Demo.class 得到反编译之后的文件
iinc 指令是在局部变量 solt 直接运算
0: bipush 10 // 加载常量 10 到操作数栈
2: istore_1 // 把槽位1的值弹出栈(a=10)
3: iload_1 // 槽位1压入操作数栈(a++);a=10
4: iinc 1, 1 // 槽位1,进行 +1;
7: iinc 1, 1 // 槽位1,执行 +1(++a);
10: iload_1 // 槽位1压入操作数栈;a=12
11: iadd // 运算a++ + ++a = 10 + 12
12: iload_1 // 槽位1压入操作数栈(a--); a=12
13: iinc 1, -1 // 槽位1,执行 -1;
16: iadd // 运算 + a--; 22 + 12
17: iinc 1, -1 // 槽位1,执行 -1(--a);
20: iload_1 // 槽位1压入操作数栈; a=10
21: iadd // 运算 + --a = 34 + 10
22: istore_2 // 结果弹出操作数栈 b= a++ + ++a + a-- + --a;
23: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
26: iload_1
27: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
30: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
33: iload_2
34: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
37: return
int i = 0,j = 0;
while(i < 5) {
j = j++;
i++;
}
System.out.println(j);
输出结果为:
0
分析:
j++ 操作分两步进行,先 iload 之后 iinc,且 iinc 的操作是在槽位进行;iload 时操作数栈中 j 的值为 0,槽位的值才为 1 。再次循环 j 的值还是为 0。
j = j++; 代码变为 j = ++j; 则输出结果为 5;先进行 iinc +1 ,j 的值变为 1 ,再加载 j 压入操作数栈。