int i=3; i=i++;i等于几.偶然看到的面试题

第一眼看到这种题,心里mmp,这么简单也放出来.看了答案,答错了,心中无数的cnm 神兽略过.

答案为3.想这么简单的题,又找不到原因,我一般是直接用工具把class文件解析字节码.以下为解析的代码:

 0 iconst_3 将常量 3 push 到栈顶
 1 istore_1 从栈顶pop 存储到局部变量表 索引为1
 2 iload_1 读取在局部变量表索引为1的变量,并push 栈顶中 ,这时栈顶为3
 3 iinc 1 by 1 这个操作是在局部变量表中进行的,并没有push 到栈顶.这时索引为1的局部变量为4
 6 istore_1  从栈顶pop 存储到局部变量表 索引为1.栈顶的值为3,覆盖掉索引为1的局部变量的值
 7 getstatic #2 <java/lang/System.out>
10 iload_1 读取在局部变量表索引为1的变量,并push 栈顶中 ,这时栈顶为3
11 invokevirtual #3 <java/io/PrintStream.println> 这时会打印出3
14 return

如果i=i++改成 i=++i; 会成什么样子:
答案为4:

0 iconst_3
 1 istore_1
 2 iinc 1 by 1
 5 iload_1
 6 istore_1
 7 getstatic #2 <java/lang/System.out>
10 iload_1
11 invokevirtual #3 <java/io/PrintStream.println>
14 return

这个是不用继续解释了,就25 调换位置跟第一个就一样了.这也就说明前缀++ ,是先自加后赋值,后缀++,先赋值后自加这一也是造成i为3的的原因(赋值push 到栈顶,自加后又从栈顶赋值到局部,不明白就看第一个解释)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值