java i++和++i的区别_从java字节码层面来理解i++和++i的区别

关于i++和++i的区别,在学习编程语言的时候都知道i++是先赋值后自增,++i是先自增再赋值。

那么事实真是这样么。

接下来让我们深入到编译后的字节码层面上来了解i++和++i的实现原理,先来看一段代码:

dc03a4beae94fc7eecd26587d4c8e9a3.png

如果按原先定义,就应该是x = x;x = x+1; 那么结果就应该是1;但是很遗憾结果是0;

将上面的源代码编译之后,使用javap命令查看编译生成的代码(忽略次要代码)如下:

82f5614d1c16bd2fa2f06e23be283663.png

iinc指令:该指令用于对本地(局部)变量进行自增减操作。该指令第一参数为本地变量的编号,第二个参数为自增减的数量。

下面我就根据上面的字节码指令来描述局部变量表和操作数栈的变化情况。

1、iconst_0:将操作数0入栈:

6a0675c0b9d808a038947c598a536e9d.png

2、 istore_1:将操作数栈顶数据出栈并存储到局部变量表的第1个位置

f4e4f459a8caa29fc852ad525c26ef48.png

3、 Iload_1:将局部变量表的第1个位置的值复制到操作数栈中

2cc75a1eb4f3d105c8b3df33bbaa5d1c.png

4、 Iinc: 将局部变量表第1个位置的值加1,此时x的值为1

a9b178c72f5e388a2f11d171608c2b7a.png

5、 istore_1:将操作数栈顶数据出栈并存储到局部变量表的第1个位置

f4e4f459a8caa29fc852ad525c26ef48.png

上面的演示过程清楚的表达了最终结果为0的原因了。

接下来我们将上面的代码稍微作下修改,将"++"移动前面来,如下:

78dd8fd422abadd9a3d836a9af54c47a.png

我们再来看下这段代码生成的字节码:

bdc9a08419537e5c9bc0a4e0ccc975c9.png

这段代码与上面的区别就在于:iload_1指令在iinc指令后面执行,所以复制到操作数栈的值是自增后的值,所以这里的结果就是1。

下面这段代码的结果留给读者分析:

7a799a89c7e6fdb9560524e09290c587.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值