先看一道面试题
1 | public static void main(String[] args) { |
1 | 输出结果: |
1.
1 | i = i++; |
- 把i的值压入操作数栈
此时操作栈数为1,局部变量表i=1
- i变量自增1
此时是对局部变量表操作,局部变量表i=2
- 把操作数栈中的值赋值给i
此时将操作栈数1赋值给局部变量表i,即i=2被覆盖,i=1.
运行完上面一句代码后i=1
2.
1 | int j = i++; |
同第一句代码一样执行,在最后赋值时,操作栈数1赋值给局部变量表j,则 j=1.而i在局部变量仍为2
运行完上面一句代码后j=1,i=2
3.
1 | int k = i + ++i * i++; |
- 把i的值压入操作数栈
操作数栈值为2
- i变量自增1
局部变量表i=3
- 把i的值压入操作数栈
操作数栈值为3
- 把i的值压入操作数栈
操作数栈值为3
- i变量自增1
局部变量表i=4
- 把操作数栈中前两个弹出求乘积结果再压入栈
操作数栈值为3X3=9
- 把操作数栈中的值弹出求和再赋值给k
操作数栈值为9+2=11
即最后运行结果为:
1 | i=4 |
总结:
1. 等号右边的从左到右加载值依次压入操作数栈
2. 自增、自减操作都是直接修改变量的值,不经过操作数栈
最后的赋值之前,临时结果也是存储在操作数栈中
参考:CSDN博客、尚硅谷面试题
未完待续
意见和建议欢迎➡右下角联系我