代码如下
public static void main(String[] ars) {
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
初学者可能会比较疑惑,为什么是这个值,下面来分析一下。
首先要知道赋值操作时要用到操作数栈的,而自增、自减操作不经过操作数栈,是直接修改局部变量表里的值。
(一)所以在i = i++;
1、将i的值放到操作数栈,此时是1;
2、i自增是直接修改局部变量表的值变成2,
3、操作数栈中i的值赋给i。
所以i的值还是1。
(二)执行这条语句int j = i++;也是一样的,把操作数栈中i的值赋给j,j就是1,此时i在局部变量表中是2;
(三)int k = i + ++i * i++;执行这句后i在局部变量表中是4,所以输出就是4了。
k的值在上述已经知道是从操作数栈中赋值的,所以来研究一下操作数栈中的数值。
1、把i的值压入操作数栈中,此时是2。
2、i自增+1。
3、把i的值压入操作数栈中,此时是3、2(3在栈顶)。
4、把i的值压入操作数栈中,此时是3、3、2(3在栈顶)。
5、i自增+1。
6、把操作数栈中前两个数弹出,求乘积后压入栈。
7、把操作数栈中的值弹出求和,再赋值给k。
所以最后打印出来k的值是11。
总结:
1、赋值= 是最后计算
2、= 右边的从左到右加载值依次压入操作数栈
3、实际先算哪个是看运算符的优先级
4、自增自减都是直接改变变量的值,不经过操作数栈
5、最后赋值之前,临时结果也是存储再操作数栈中