深层理解在java中的 “”i=i++;”的运算结果及运行原理
浅谈java中的 “i=i++;”
首先有一下代码:
public class Demo{ public static void main(String []args){ int i=12; i=i++; System.out.println(i); } }
你可以试想这段代码是多少 大多数同学可能会回答是13,然而事实并非如此,如下图结果:
在上图中,我首先进行了运行,可以看到结果,我们的i并不是如大多人猜测的那样为13输出 ,而是看上去没有做这个自增的操作,然而这是为什么呢?
于是,就有了后面反编译为字节码的操作,我们利用javap 指令反编译后可以看清楚其中发生的事情,有同学对其中的JVM指令不清楚,没关系,我这里先普及一下本文代码中所涉及的JVM指令;
(这里的关键指令码在于main方法之后,因此只针对于下面的指令进行解释,其之前的是虚拟机自动构建的默认构造方法的指令码)
1.bipush: 将单字节的常量值(-128~127)推送至栈顶
2.istore: 将栈顶int型数值存入指定本地变量
3.iload: 将指定的int型本地变量推送至栈顶
4.iinc: 该指令用于对本地(局部)变量进行自增减操作。该指令第一参数为本地变量的编号,第二个参数为自增减的数量
5.getstatic 获取指定类的静态域,并将其值压入栈顶(到这个位置之后就是调用静态对象out打印的操作不再赘述,感兴趣的同学可以在本文末尾附上的链接的去了解一下)
知道基本的几个指令之后我们来分析上图中关键指令的意思吧:
bipush 12这里是把12推至栈顶 栈里存储了12 这个int数值
istore_1 这里是把12弹出给第二个(备注:第1个本地变量应该是this)本地变量 即i=12
iload_1 这里是把第二个本地变量(i)的值推入栈顶 此时栈顶为12
iinc 1,1 自然是i=i+1 即i++ 这个时候i=13
istore_1这里是把栈顶值弹出给本地变量i,这个时候 i又被赋值为 12
因此最终 打印出来的时候i为12。
CSDN一老哥整理的JVM指令集合,很方便查询学习
相关文章:
相关视频:
以上是深层理解在java中的 “”i=i++;”的运算结果及运行原理的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

Java 8引入了Stream API,提供了一种强大且表达力丰富的处理数据集合的方式。然而,使用Stream时,一个常见问题是:如何从forEach操作中中断或返回? 传统循环允许提前中断或返回,但Stream的forEach方法并不直接支持这种方式。本文将解释原因,并探讨在Stream处理系统中实现提前终止的替代方法。 延伸阅读: Java Stream API改进 理解Stream forEach forEach方法是一个终端操作,它对Stream中的每个元素执行一个操作。它的设计意图是处

Java是热门编程语言,适合初学者和经验丰富的开发者学习。本教程从基础概念出发,逐步深入讲解高级主题。安装Java开发工具包后,可通过创建简单的“Hello,World!”程序实践编程。理解代码后,使用命令提示符编译并运行程序,控制台上将输出“Hello,World!”。学习Java开启了编程之旅,随着掌握程度加深,可创建更复杂的应用程序。
