一篇文章带你从java字节码层理解i++和++i
作者:快乐柠檬 发布时间:2023-05-29 13:57:58
程序目的
从java字节码层理解,为何i = i++后,结果是+1之前的数值。而i=++i后,结果是+1之后的值。
关键指令
iload_<n>:
从局部变量表获取值,并压入操作数栈。
istore_<n>:
出栈,然后存储到局部变量表。
i++示例源码
public class TestIPulsPlus {
public static void main(String[] args) {
int i = 8;
i = i++;
// i = ++i;
System.out.println(i);
}
}
i++执行结果:
8
使用jclasslib查看i++字节码
找到main方法的Code区:
图:i=i++字节码
字节码解读
0 bipush 8
把数值8压入操作数栈,压栈前转为int类型。
2 istore_1
8出栈,存到编号为1的局部变量表。
图:编号为1的局部变量为1
以上两行指令,完成了int i = 8;
这行代码。
3 iload_1
从局部变量表,获取int值8。然后压到操作数栈。
4 iinc 1 by 1
把局部变量表中的i,进行+1操作。此时栈里面数值是8,局部变量表中i为9。
7 istore_1
8出栈,存到编号为1的局部变量表。也就是赋值给i变量。局部变量表的i值从9变为8。
接下来,解读i=++i的字节码
图:i=++i;字节码
++i示例源码
public class TestIPulsPlus {
public static void main(String[] args) {
int i = 8;
//i = i++;
i = ++i;
System.out.println(i);
}
}
执行结果为:
9
i=++i字节码解读
0 bipush 8
把数值8压入操作数栈,压栈前转为int类型。
2 istore_1
8出栈,存到编号为1的局部变量表。
图:编号为1的局部变量为1
以上两行指令,完成了int i = 8;这行代码。
3 iinc 1 by 1
把局部变量表中的i,进行+1操作。此时,局部变量表中i为9。
6 iload_1
从局部变量表,获取int值9。然后压到操作数栈。
7 istore_1
9出栈,存到编号为1的局部变量表。也就是赋值给i变量。
参考
Chapter 6. The Java Virtual Machine Instruction Set
来源:https://blog.csdn.net/limenghua9112/article/details/120415912


猜你喜欢
- 本文介绍C#编程时,给定一个字符串,如何判断它是不是一个日期。本文将介绍两种方法,一个是判断字符串是否是时间,如果是就转换为一个时间变量,第
- 学习内容:1.普通参数2.pojo参数3.嵌套pojo4.数组参数5.集合参数6.解决中文乱码7.json数据传递参数案例分析:1.pom.
- 使用RestTemplate时报错RestClientException这是自己封装的一个发送请求的方法public Map&l
- 本文实例讲述了Android编程之SharedPreferences文件存储操作的方法。分享给大家供大家参考。具体分析如下:SharedPr
- SpringBoot使用protobuf格式的接口建立SpringBoot项目,pom.xml内容如下:<?xml version=&
- 原本计划这一篇来总结JSP,由于JSP的内容比较多,又想着晚上跑跑步减减肥,所以今天先介绍Filter以及它的使用举例,这样的话还有些时间可
- MyBatis 是一款常用的持久层框架,使得程序能够以调用方法的方式执行某个指定的SQL,将执行SQL的底层逻辑进行封装。多数与Spring
- 一、abstract 抽象的抽象类:被abstract 修饰的类语法: abstract class 类名{}抽象方法 : 被a
- 一、前言最近在加强 ITAEM 团队的一个 app 项目——学生教师学习交流平台人员组成:安卓 + 前端 + 后台后台 DAO 层借鉴了华工
- 1 分布式1.1 什么是分布式分布式系统一定是由多个节点组成的系统。其中,节点指的是计算机服务器,而且这些节点一般不是孤立的,而是互通的。这
- 本文实例为大家分享了Android studio设计简易计算器的具体代码,供大家参考,具体内容如下效果显示:第一步,简单的界面布局<?
- springboot就是简化Spring应用中的初始化配置,快速创建项目而生的。创建springboot项目代开idea,点击File—&g
- 随着目前微信越来越火,所以研究微信的人也就越来越多,这不前一段时间,我们公司就让我做一个微信公众号中问卷调查发红包功能,经过一段时间的研究,
- 1.导入System.Runtime.InteropServices命名空间。2.API函数ShowWindow()能够控制人和窗体的现实状
- 前言Feign是一个声明式的Web服务客户端,是面向接口编程的。也就是说使用Feign,只需要创建一个接口并使用注解方式配置它,就可以完成对
- 简介:顺序一致性内存模型是一个理论参考模型,处理器的内存模型和编程语言的内存模型都会以顺序一致性内存模型作为参照。1、数据竞争和顺序一致性当
- System_Server进程运行在system server进程中的服务比较多,这是整个android框架的基础Native服务Surfa
- 由于老师说如果拿MATLAB制作出游戏或者有趣的动画的话。。平时成绩可以拿满分于是。。开始尝试制作各种matlab小游戏最初通过Alex的贪
- OpenCv提供了函数 findContours()用于对物体轮廓进行检测,该函数实现算法是由S.suzuki K.Abe于1985年发表的
- 简介API Gateway,时系统的唯一对外的入口,介于客户端和服务端之间的中间层,处理非业务功能,提供路由请求,鉴权,监控,缓存,限流等功