图解 i++ 和 ++i 的区别,看了必懂...

简介: 图解 i++ 和 ++i 的区别,看了必懂...

先看一段代码:

int i = 0;
int a = i++;
sout("a的值是:"+i);
sout("i的值是:"+i);• 1
• 2
• 3


最终的编译之后的核心字节码如下

L0
 BITPUSH 0  //将常量0压入操作栈
 ISTORE_1  //将当前栈顶元素,弹出并保存到局部变量表的slot_1中
L1
 ILOAD_1   //从局部变量表的第一个slot槽中,取出该值,压入操作栈顶
 IINC 0,1    //直接将slot槽中的值自增(+1)操作,注意此时是与当前栈无关的
 ISTORE_2   //将当前栈顶元素,弹出并保存到局部变量表的slot_2中
L2
 ILOAD_2    //从局部变量表的第二个slot槽中,取出该值,压入操作栈顶
  IRETURN  //返回栈顶元素


这里有两个注意点:

  • IINC 的自增操作,并未影响当前的栈顶元素,并且 slot_1 中的元素自增完成后,已经由0变成了1
  • ISTORE_2 弹出的栈顶元素值依旧是0,并未改变


最终的输出的结果为:

a的值是: 0
i的值是: 1;


我这里画了一个图来帮助大家理解

image.png

image.pngimage.png

image.png

image.png

image.png


再来看看++i

int i = 0;
int a = ++i;
sout("a的值是:"+i);
sout("i的值是:"+i);


对于++i 来说,对应的字节码如下,先自增再入栈,那么结果就很清晰了

最终的核心编译之后的字节码如下


L0
 BITPUSH 0  //将常量0压入操作栈
 ISTORE_1  //将当前栈顶元素,弹出并保存到局部变量表的slot_1中
L1
 IINC 0,1    //直接将slot槽中的值自增(+1)操作
 ILOAD_1   //从局部变量表的第一个slot槽中,取出该值(该值此时已经自增过了),压入操作栈顶
 ISTORE_2   //将当前栈顶元素,弹出并保存到局部变量表的slot_2中
L3
 ILOAD_2    //从局部变量表的第二个slot槽中,取出该值,压入操作栈顶
 IRETURN  //返回栈顶元素


最终的输出的结果为:

a的值是: 1
i的值是: 1;


总结

i++ 和 ++i 在理论上的区别是 :

  • i++:是先把i拿出来使用,然后再+1;
  • ++i :是先把i+1,然后再拿出来使用;
相关文章
|
存储 缓存 算法
数据结构-链表(一)
链表(Linked List)是一种常见的数据结构,用于存储和组织数据。与数组不同,链表的元素(节点)在内存中不必连续存储,而是通过指针链接在一起。 链表由多个节点组成,每个节点包含两部分:数据(存储实际的元素值)和指针(指向下一个节点的引用)。链表的第一个节点称为头节点,最后一个节点称为尾节点,尾节点的指针通常指向空值(null)。
677 1
|
SQL 算法 Java
Mybatis-plus超详细讲解(2022)
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。
4418 1
|
10月前
|
存储 运维 数据挖掘
革新智能驾驶数据挖掘检索效率!某国内新能源汽车未来出行领导者选择阿里云Milvus构建多模态检索引擎
在智能驾驶技术快速发展中,数据成为驱动算法进步的核心。某新能源汽车领军企业基于阿里云Milvus向量数据库构建智能驾驶数据挖掘平台,利用其高性能、可扩展的相似性检索服务,解决了大规模向量数据检索瓶颈问题,显著降低20%以上成本,缩短模型迭代周期,实现从数据采集到场景挖掘的智能化闭环,加速智能驾驶落地应用。
1140 3
革新智能驾驶数据挖掘检索效率!某国内新能源汽车未来出行领导者选择阿里云Milvus构建多模态检索引擎
|
4月前
|
弹性计算 运维 安全
2026年阿里云 ECS 云服务器的定义、购买流程、功能优势与使用指南说明
阿里云 ECS(Elastic Compute Service)是阿里云提供的 IaaS(基础设施即服务)级云计算服务,用户无需提前采购物理服务器,就能像使用水电一样便捷地获取计算资源,实现 “即开即用” 和弹性伸缩,适配从个人开发到企业核心业务的全场景需求。以下从核心定义、购买方式、产品优势、使用途径及部署建议等维度,用通俗语言展开解析,帮助用户全面了解 ECS。
|
JSON 安全 Java
Spring Security 6.x 微信公众平台OAuth2授权实战
上一篇介绍了OAuth2协议的基本原理,以及Spring Security框架中自带的OAuth2客户端GitHub的实现细节,本篇以微信公众号网页授权登录为目的,介绍如何在原框架基础上定制开发OAuth2客户端。
1222 4
Spring Security 6.x 微信公众平台OAuth2授权实战
|
Java
java基础 - 个人笔记
java基础 - 个人笔记
665 2
|
前端开发 JavaScript Java
springmvc前端jsp与html
在Spring MVC框架中,前端页面既可以使用JSP(JavaServer Pages)也可以使用HTML,具体使用哪一种或哪几种技术,主要取决于项目的需求、团队的熟悉度以及项目的可维护性等因素。
295 2
|
网络协议 Java API
如何在Java中实现WebSocket通信
如何在Java中实现WebSocket通信

热门文章

最新文章