Java中i++和++i剖析

如下代码片段为什么i的结果为1呢?

public class Test1 {
    public static void main(String[] args) {
        int i = 1;
        i = i++;
        System.out.println("i = " + i);
    }
}

使用javac将java文件执行为class文件,查看class文件如下:

注意:这里使用的查看字节码的工具jclasslib来查看的字节码文件,使用普通记事本无法查看字节码文件

在这里插入图片描述

可以看到字节码查看后最常见的为:iconst和istore、iload命令,我们可以查看jvm规范可知这些命令的意思

使用jclasslib可以点击命令,即可直接跳转jvm规范。

举例说明iconst命令如下,iconst_常量,就是将常量推动到操作数堆栈上
在这里插入图片描述

除了操作数堆栈,还会涉及局部变量表,用来存放java中的局部变量,是一个数组形式的结构,例如istore命令会操作操作数栈和局部变量表的数据转换。

在这里插入图片描述

而局部变量表的索引我们可以通过jclasslib文件查看对应索引表示的变量,如下图,可看到索引0的变量为main方法的入参args,而索引为1的位置对应代码变量的i

在这里插入图片描述

那么按照以上所学来解析字节码文件:

在这里插入图片描述

因此,通过分析字节码指令发现,i++先把1取出来放入临时的操作数栈中,接下来对i进行加1,i变成2,最后再将之前保存在操作数栈中的1放入i,最后i就变成了1

试着分析下面++i的字节码文件
在这里插入图片描述
学习来自b站黑马程序员:https://www.bilibili.com/video/BV1r94y1b7eS/?p=6&spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=1ce01044ae4ff6567e9f29e1b3bca51c

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值