Java中i++和++i剖析

发布时间:2023年12月20日

如下代码片段为什么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的字节码文件
在这里插入图片描述

文章来源:https://blog.csdn.net/qq_46062118/article/details/135114157
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。