i++ 与 ++i 的解析(从字节码角度)

一个简单的程序

int n=0;
int i=0
while(n<10)
{
	i=i++;
	n++;
}
System.out.print(i);

先说结果,i最后的结果是 0

这时对 i++ 这个运算理解不深的人就会觉得,i 每次自增之后赋值给自己,结果不应该是10 吗

在分析结果之前,我们先了解一些jvm的内容

jvm内存分区中有一个叫做栈的区域,这其中由栈帧组成,可以简单理解为每一个栈帧就是一个方法,而栈帧包括局部变量表操作栈等,我们主要了解这两个就可以,结合下面的图会更直观一些
在这里插入图片描述

然后我们了解两个字节码指令

这是java代码编译后的字节码指令,我使用通俗易懂的语言来解释
-第一个指令,我们管他叫做load,它的作用是把一个字面量加载到操作栈中
-第二个指令,我们叫它 inc,它可以把局部变量表的值进行原地自增,一定是局部变量表中的值原地自增

i++的过程就是先load再inc,++i正相反 先inc再load
如果还是不明白下面附上图示过程

i++的过程

在这里插入图片描述

同理 ++i的过程类似

在这里插入图片描述

了解了以上内容后原因就已经出来了:

重点就在 i=i++; 这句话
执行i++后的栈帧内容是这样的
在这里插入图片描述
但是在这之后又做了一个赋值的动作,赋值就是把操作栈中的结果再返回给局部变量表,那么这句话执行结束后 i 的值又变回了0,如果没有其他因素干扰,这样循环多少次,i 仍然是0;

:本文标题是从字节码分析,但是正文没有涉及字节码内容,因为我在学习这里的时候,我看到字节码是头都大,我相信大部分普通人也是不愿意去看那种东西。所以我只挑选了我认为关键的部分来进行分析,使用一些更加容易理解的词,而不是使用大量的专业术语。如果对这些东西感兴趣可以去系统学习一下jvm以及操作系统。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值