图解 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)。
709 1
|
JSON JavaScript 小程序
关于HBuilderX的简单介绍
关于HBuilderX的简单介绍
4247 0
|
4月前
|
人工智能 安全 机器人
企业OpenClaw部署实践:基于阿里云无影一键部署方案
OpenClaw(原Clawdbot/Moltbot)是一款开源本地优先AI智能体平台,支持自然语言调用浏览器、邮件、文件等工具,自动处理文档、日程、邮件等任务。阿里云提供一键部署方案,尤其推荐无影云电脑版——集中管理、多端接入、7×24稳定运行、数据不出域、开箱即用。
528 15
|
9月前
|
存储 数据采集 监控
Python定时爬取新闻网站头条:从零到一的自动化实践
在信息爆炸时代,本文教你用Python定时爬取腾讯新闻头条,实现自动化监控。涵盖请求、解析、存储、去重、代理及异常通知,助你构建高效新闻采集系统,适用于金融、电商、媒体等场景。(238字)
1485 2
|
11月前
|
人工智能 编解码 文字识别
为大家介绍5个好用的小软件
本文介绍了五款实用软件:Aconvert(文件转换)、XYplorer(文件管理)、3171.CN(在线AI工具箱)、Wondershare PDF(PDF处理)和净网大师(网络优化),涵盖办公、文件处理与上网优化,助力提升日常效率。
971 0
|
数据采集 存储 消息中间件
数据应用:从采集到分析 —— 构建端到端数据管道
本文分享了一个针对亚洲航空官网的爬虫项目实践,从需求提出到最终优化,详细记录了故障解决与架构改进的过程。初期因频繁访问被限制后,通过引入代理IP、伪装User-Agent和Cookie等技术突破反爬机制。随后采用分布式爬虫架构、智能代理切换及容错重试机制提升系统稳定性。示例代码展示了如何配置代理并解析航班信息,为类似项目提供了完整的技术参考与经验总结。
354 9
|
人工智能 自然语言处理 算法
分享几个.NET开源的AI和LLM相关项目框架
分享几个.NET开源的AI和LLM相关项目框架
302 6
|
JSON 前端开发 JavaScript
不会webpack的前端可能是捡来的,万字总结webpack的超入门核心知识
该文章提供了Webpack的基础入门指南,涵盖安装配置、基本使用、加载器(Loaders)、插件(Plugins)的应用,以及如何通过Webpack优化前端项目的打包构建流程。
不会webpack的前端可能是捡来的,万字总结webpack的超入门核心知识