读懂jvm之i = i++问题

之前实习背八股文的时候,有刷到过这样一道题目

int count = 0;
for (int i = 0; i < 100; i ++) {
     count = count ++;
}
System.out.println(count);

问程序输出多少,当时看到答案输出是0的时候,整个人都是蒙圈的,怀疑了整个世界。后来也去查阅了不少资料,统一给出的答案都是,count在自增后会被原来的值覆盖,所以无论怎么循环都还是原来的数字,对于当时比较菜鸡的我来说,看jvm的字节码指令无疑是看天书一样,直到最近在读jvm相关的书籍的时候,又想到了这个问题,所以牵出来溜溜。

先看下面两段的程序及反编译后的字节码指令

int i = 0;
i = i++;

int i = 0;
i = ++i;

要理解为啥结果不一样,其实理解了这几个命令就不难了。这里就不一一介绍了,挑重点的说吧

iload是吧局部变量表里的变量压入到操作数栈(jvm都是在操作数栈里执行操作,然后再写入到局部变量表的),iinc是做递增操作。就第一段程序而言,我的理解是这个指令是直接在局部变量表里执行的,所有操作数栈没有变化,还是原来的值,随后又将旧值写入(istore_1)到局部变量表,覆盖了递增后的值。而第二段则是先做的递增,然后将递增后的值压入到操作数栈再写回局部变量表,所以达到了递增的操作。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值