图解i++和++i,从底层搞懂它们的原理

本文通过实例和反编译源码详细解释了Java中i++和++i的区别。i++是先取值后计算,++i则是先计算后取值。通过分析局部变量表和操作数栈的工作方式,展示了它们在赋值时的不同处理,帮助读者理解这两个操作的底层原理。
摘要由CSDN通过智能技术生成

今天突然看到一个题,是有关于 i++、++i,对于他们的结果一直以来只是记住口诀,并不知道原理,使用起来也不那么顺畅。

i++:先取值,后计算
++i:先计算,后取值

若当题目仅仅是 i = i++;时,自己能迅速求出结果,但要是题目是 i = i + ++i + i++;的时候就有点头疼了,还很可能会搞错。

到底++计算过程是怎么样的呢,我于是就好奇了,到底他们是怎么实现的呢,今天就将它们的原理说一下。



几个相关的考题

起因是突然看到了这几道题目,一瞬间自己居然不知道正确结果是什么,而且还要考虑很久,这一看就是 知其然,不知其所以然 的表现。

题目如下:

//第一题:
int i = 0;
i++;
System.out.println(i);

//第二题:
int j = 0;
j = j++;
System.out.println(j);

//第三题:
int n = 0++n;
System.out.println(n);
//n = ++n 和 n++ 的结果一样吗?

//最终考题:
int a = 1; 
a = a++; 
int b = a++; 
int c = a + ++a * a++; 
System.out.println("a="+a); 
System.out.println("b="+b); 
System.out.println("c="+c); 

你们知道这些题的答案吗,也会像我一样犹豫吗?没事,下面的文中我会告诉你它们的运算原理是什么,往下看。

i ++

首先公布第一题和第二题的答案。

//第一题:
int i = 0;
i++;
System.out.println(i);// 1

//第二题:
int j = 0;
j = j++;
System.out.println(j); // 0

这是为什么呢?都是i++,怎么结果却不一样。不多说,直接贴出反编译的源码,根据运行过程一步步来分析。源码先用javac xx.java进行编译,然后使用javap -v xxx.class可以反编译得到。

首先看看第一题反编译后的源码:

public static void main<
最低0.47元/天 解锁文章
一篇文章彻底弄懂 i++++i
HelloWorld
11-25 778
一篇文章彻底弄懂 i++++i Java中i++++i 想必大家都不陌生,但大多数同学对此可能都只是处于基础了解 @Test public void calculate(){ int i = 0; int m = i++; System.out.println(m);//输出0 int a = 0; int b = ++a; System.out.println(b);//输出1 }
C++++i和i++底层原理
qq_41392228的博客
07-07 592
如下图所示,++i和i++两条语句的汇编语句是一模一样的,效率相同 如下图,右边的汇编语言所示,i++语句会建立一个临时变量edx来完成自加操作,然后赋值给变量i 从汇编中我们也能看出,i++赋值给a变量时,表象是先a=i,然后再i = i + 1;16-17行是i的自加操作,第18行是将之前i 的值赋值给变量a ++i可以一步到位,是因为++i是左值,可以直接赋值,而i++是右值,不能直接赋值,需要分两步 参考视频......
关于i++底层实现原理
zhangpeng759的专栏
03-03 6703
大家都知道i++在做运算的时候,是先赋值再自加1,但底层究竟是怎样实现的呢?下面,就三个例子来说明一下i++底层实现原理。 第一个例子: public class Test1{ public static void main(String [] args){ int i = 10; i = i++; System.out.println(i); } }程序输出为
【汇编 C】i++++i底层刨析
qq_52572621的博客
09-21 929
不过++ii输出的是+1之后的变量,而ii++输出的则是+1之前备份的临时变量。代码的逻辑很简单,简单到没有逻辑。都是先+1,然后再输出。
图解 i++++i 的区别,看完不懂你顺着网线来揍我!
Java笔记虾
01-07 681
点击关注公众号,利用碎片时间学习先看一段代码:inti=0; inta=i++; sout("a的值是:"+i); sout("i的值是:"+i);最终的编译之后的核心字节码如...
【秒懂i++运算】关于i++底层实现原理
A-Itfuture的博客
08-31 1705
在编程学习中,好多人对于i++++i非常得混乱,这里可能有人会说那有什么难的,i++是先用后自增,++i是先自增后调用,是的没错,既然那么自信,请往下阅读吧! 既然都知道i++在做运算的时候,是先赋值再自加1,但底层究竟是怎样实现的呢? 问题1: public class test1 { public static void main(String[] args) { int i=5; i=i++; System.out.println(i); .
显微镜下的 i++++i
程序员吴师兄的博客
01-15 997
注意,以下讨论的语言是 Java这个问题被网上的好多文章写烂了,但基本重复度很高,我看过后的感觉是,大部分都是错误的、误导读者的。随便百度一下,我们打开第一条。上来先说个结论i++ 先赋...
串口通信协议 UART+I2C+SPI
qq_42024067的博客
09-17 2490
UART I2C SPI 不同串口通信协议比较 UART UART是通用异步收发传输器,使用RxD和TxD两根线实现异步全双工通信;为确保通信可靠,可以在通信两边接共地;因此,完整的UART通信只需最少3根线即可。 RxD是发送数据线,TxD是接收数据线,通信双方使用交叉互联,RxD接对方TxD,TxD接对方RxD。UART使用标准的TTL/CMOS电平(0-5V,0-3.3V,0-2.5V,0-...
阿里面试失败后,一气之下我图解Java中18把锁
热门推荐
华科硕士,大厂打工中。编程问题咨询,请私我
06-17 41万+
目录 乐观锁和悲观锁 独占锁和共享锁 互斥锁和读写锁 公平锁和非公平锁 可重入锁 自旋锁 分段锁 锁升级(无锁|偏向锁|轻量级锁|重量级锁) 锁优化技术(锁粗化、锁消除) 乐观锁和悲观锁 悲观锁 悲观锁对应于生活中悲观的人,悲观的人总是想着事情往坏的方向发展。 举个生活中的例子,假设厕所只有一个坑位了,悲观锁上厕所会第一时间把门反锁上,这样其他人上厕所只能在门外等候,这种状态就是「阻塞」了。 回到代码世界中,一个共享数据加了悲观锁,那线程每次想操作这个数据前都会假设其他线程.
图解Transformer(完整版)
龙心尘
01-17 40万+
审校:百度NLP、龙心尘 翻译:张驰、毅航、Conrad 原作者:Jay Alammar 原链接:https://jalammar.github.io/illustrated-transformer/ 编者按:前一段时间谷歌推出的BERT模型在11项NLP任务中夺得SOTA结果,引爆了整个NLP界。而BERT取得成功的一个关键因素是Transformer的强大作用。谷歌的Transformer模型...
iOS SDWebImage的使用和底层原理
Zgbin的博客
03-08 2630
一、SDWebImage的使用 1、SDWebImage的安装集成有2种方式: (1)直接到github地址下载,链接https://github.com/rs/SDWebImage (2)用cocoapods安装,在文件夹生成的podfile文件中添加pod 'SDWebImage' ,终端cd + 文件位置,然后pod install即可 2、UITableView中导...
【c++】语言基础:++i & i++底层区别
二十三小时
04-20 1571
++i 和 i++底层区别 ++i,是先取 i 的地址,增加它的内容 ,然后把值放到寄存器中 i++,是先取 i 的地址,把它的值装入寄存器,然后增加内存中 i 的值 关于 ++i 是左值,而 i++ 是右值的问题 ++i,返回值是 i 本身自己,是一个变量 i++,返回值是 i 之前的一个数值,是一个数,不是变量 因此 ++(i++) 这就是错误的,因为 i++ 返回的是右值,而不能 ++右值。
i++++i底层原理实现
qq_37922915的博客
10-27 296
1.1、i++ int i=0; for(int j=0;i<50;j++){ i=i++; } ------编译后指令------- //通过:javap 类名.class 反解析 iload_0 将局部变量表slot=0的变量(i),加载到操作数栈上 iinc 对局部变量表slot=0的变量(i)直接加1,但是操作数栈还是0 istore_o 将栈顶元素出栈赋值给局部变量表slot=0的变量。 //此时,局部变量i又被赋值为0 1.2、++i ii...
i++++i区别, 底层原理
巴黎左岸 · 荼靡花开
08-06 512
a = ++i,相当于 i=i+1; a = i; a = i++,相当于 a = i; i=i+1;
i++++i的底层窥探以及多个+连用的处理方式
最新发布
m0_71299382的博客
05-08 664
在printf所在行打断点 即按F9/F9+Fn然后按F5/F5+Fn最后按alt+G以上是窥探代码汇编的步骤我们从中挑重点讲他将i赋值给了eax这个寄存器 然后将寄存器中的数据赋值给了一个临时变量 对i进行+1操作 然后将这个临时变量打印输出 但是对于这个临时变量不能够进行赋值操作 由于i++的返回值就是这个临时变量 所以对i++不能够进行赋值操作。
底层搞定i++++i的区别
cf_jinji的博客
10-11 197
底层搞定i++++i的区别
i++++i原理
m0_55826123的博客
09-06 118
i++ 即后加加,原理是:先自增,然后返回自增之前的值 ++i 即前加加,原理是:先自增,然后返回自增之后的值
i++++i的JVM底层实现
weixin_47071411的博客
03-22 566
i++++i的底层 i++++i的区别:先执行iload指令还是innc指令 假如i=4,s=i++时 先执行iload 1,(i在局部变量表索引22的位置),将局部变量表索引22位置的i的值4压入操作数栈 然后执行引擎对i执行自增运算(innc 22,1),innc指令是在局部变量slot(槽)上进行运算的,所以局部变量表上的i=5 最后执行执行istore 2(s在局部变量表索引2的位置),所以s=4. 假如i=4,s=++i时 首先执行引擎对i执行自增运算(innc 22,1),innc
写文章

热门文章

  • 在SpringBoot项目中使用Logback进行日志管理,Logback配置详解 7180
  • IntelliJ IDEA 无法导入maven依赖,或者下载jar包无反应的解决方式 6078
  • 图解i++和++i,从底层搞懂它们的原理 3900
  • MySQL原理,看这一篇就够了(InnoDB、MVCC、索引、SQL优化) 3564
  • Java知识体系脑图(2020年) 2675

分类专栏

  • Java集合 1篇
  • 面试记录 6篇
  • 并发与多线程 6篇
  • Java基础 17篇
  • 面试 16篇
  • 算法 2篇
  • 分布式 1篇
  • Linux 2篇
  • 设计模式
  • Redis 5篇
  • RocketMQ 1篇
  • SpringBoot 1篇
  • JVM与计算机基础 8篇
  • 开发工具
  • MySQL 2篇
  • 笔记 4篇

最新评论

  • Java知识体系脑图(2020年)

    jiangfengzzd: 大佬能不能分享脑图源文件啊表情包

  • 图解i++和++i,从底层搞懂它们的原理

    尼尧Nier: 不好意思,很久没登录,具体参考文内第二题的解析,原因是由于java计算方式【先压栈再计算】导致被栈内的数覆盖了哈。

  • 图解i++和++i,从底层搞懂它们的原理

    天鹅打架了: 最后一题a=a++的a结果怎么能是1呢

  • Java知识体系脑图(2020年)

    peexiao: 这个框图厉害了呀,爱了爱了表情包

  • 图解i++和++i,从底层搞懂它们的原理

    起个名字好难呢: 太清晰了!

最新文章

  • 线程的通信机制
  • synchronize与volatile
  • Java与线程、线程的状态
2020年52篇
2018年1篇
2016年1篇

目录

目录

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

天下网标王推广型网站和优化型网站区别换服务器网站优化受影响吗济南优质网站建设优化服务丽水网站优化加盟天津天津网站优化费用大连网站优化如何网站改版对优化的影响黄冈工厂网站优化哪家好廊坊核心词优化网站南平市网站优化西安seo优化网站网站优化最牛逼的软件宜城网站优化技术网站优化预算新乡网站推广优化收费标准金阊网站优化公司湖北网站关键词百度优化海南优质网站优化价格兰州网站优化专业服务商嘉兴百度网站优化企业网站如何优化内容小企业网站优化密云网站排名优化推广网站建设网站排名推广优化公司兴宁网站优化排名软件凡科网站有没有优化网站建设seo优化培训手机网站排名优化软件怎样给网站做优化公司更可靠丰南专业的网站优化推荐香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

天下网标王 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化