自增和自减 其实就是操作局部变量表和数栈
举个例子:
public static void main(String[] args) {
int i=1;
i = i++;
int j=i++;
int k=i+ ++i * i++;
System.out.println("i="+i);
System.out.println("j="+j);
System.out.println("k="+k);
}
先给出结论,三个变量的值分别是
i=4,j=1,k=11
那么问题来了,是怎么计算出来了的?
先看字节码文件:
0 iconst_1 1(int)值入栈
1 istore_1 将栈顶int类型值保存到局部变量1中
2 iload_1 从局部变量1中装载int类型值入栈
3 iinc 1 by 1 然后进行i++的操作 就是把值2放进局部变量表中 但是栈里的值还是1
6 istore_1 将栈顶int类型值保存到局部变量1中 所以 i的值又变成1了
7 iload_1 从局部变量1中装载int类型值入栈
8 iinc 1 by 1 然后进行i++的操作 就是把值2放进局部变量表中 所以i=2了
11 istore_2 将栈顶int类型值保存到局部变量1中 因为 i的数栈还是1 1赋值给了j 所以j=1 而不是 i=1 (i=2)
(int k=i+ ++i * i++)这步比较麻烦 我们要先把值入栈 在做运算
1.首先局部变量 的 i=2 那么 i 入栈第一个值是2
2.然后++i 先自增那么局部变量表的i=3 然后入栈 3
3.i++ 先入栈 那么局部变量中的3 直接入栈 3 在自增 局部变量表 i=4
那么目前 栈中的值分别是 2 3 3
然后我们要进行运算了 先进行乘法运算 3*3=9 因为9没办法赋值给变量所以也要先压入栈
那么现在栈中的值分别是 2 9
在进行加法 9+2=11 那么栈中的值变成11了
然后还有最后的= 操作 就是 把栈中的值11 赋值给k (k=11)
字节码文件:
0 iconst_1
1 istore_1
2 iload_1
3 iinc 1 by 1
6 istore_1
7 iload_1
8 iinc 1 by 1
11 istore_2
12 iload_1
13 iinc 1 by 1
16 iload_1
17 iload_1
18 iinc 1 by 1
21 imul
22 iadd
23 istore_3