Java中i++和++i剖析
2023-12-20 22:57:41
如下代码片段为什么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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!