141、下面代码的执行结果?
public void test2(){
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++ 先运算等号右边的,赋值操作最后计算,即先算 i++,由于++在后面,所以自加要后算,因此JVM会把1压入操作数栈中,然后,i自增,这时候,局部变量表里面的 i 变为了2,这就结束了吗?显然不是,上面仅仅是做了等号右边的运算,赋值操作还没有进行呢!!这时候,JVM会把操作数栈里面的值,也就是1啊,赋值给i,转了一圈发现,i 还是 1,也就是说,i 曾经变为过2,现在还是1. 注意:自增自减操作不经过操作数栈,而是直接在局部变量表内部更新数据!!
再看下一行,和上一行的区别是,i++之后不再是赋值给i了,而是赋值给j了,所以说,执行完这一行之后,j的值就是1,i的值变为了2.
再看k这一行,同理,先把i(i此时是2)、++i(i变为了3)、i++(目前是3,执行完就变为4)压入操作数栈中,进行先乘后加的运算,即2+3*3=11,赋值给k,此时i变为4,j还是1。
言语表达能力有限,不知道您看懂了吗?总结来说吧:
- 赋值=操作,最后计算
- =右边的从左到右加载值依次压入操作数栈
- 实际先算哪个,要看操作符优先级
- 自增、自减操作都是不经过操作数栈,而是直接修改变量的值
- 再进行最后赋值之前,临时结果也是存储在操作数栈中。