| |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| -> Java知识库 -> JAVA i++ 与++i的在jvm中执行过程 -> 正文阅读 |
|
|
[Java知识库]JAVA i++ 与++i的在jvm中执行过程 |
|
目录 一:起因:以下代码为什么打印值为0?
二:分析什么原因呢?那么直接看i++的操作指令吧;
? 上面的指令执行过程: ? ? ? ? 1:int值0入栈; ?2:把0赋值给局部变量1,即:i= 0 ;
?3: 局部变量1 的值入栈,放到操作数栈中;
?4:执行自增操作,注意这里jvm iinc的说明是 把常量值加给int类型的局部变量上,值得注意的是下面的行号缺失了几行。我的理解是:jvm在底层直接操作了这个运算并且赋值给了变量1;
5:把操作数栈的值赋值给变量2,即:j= 0;? 这个值在自增前已经入栈了;
6:把变量2 的值入栈;
?7:也就是打印结果为0; 那么++i的操作指令呢?执行的流程就不画了。
三:总结注意对比下iinc上下的指令; i++ 是在 执行iload指令之后执行的iinc指令,啥意思呢? i++在执行iinc指令之前已经把变量1的值加入到操作数栈了,而 ++i? 是赋完变量1的值后 直接执行iinc(自增操作)后,执行iload_2,把变量2的值加入到操作数栈,也就是说 此时操作数栈的值是执行 (iinc指令)?自增后的值。 ? ? ? ? 有些文档说 i++ 是先赋值 在计算 ,而 ++i是先计算再赋值。 个人理解:应该是不正确的。为啥呢? 对比两者之间的指令,不难发现,赋值都是在iinc指令之后,只是i++在执行自增前已经把变量i的值写入到操作数栈了,在赋值的时是用的自增前的值,而++i是在执行iinc指令后从局部变量表中拿的值赋值给变量2的。 |
|
|
|
|
| 上一篇文章 下一篇文章 查看所有文章 |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| 360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年12日历 | -2025/12/13 15:25:10- |
|
| 网站联系: qq:121756557 email:121756557@qq.com IT数码 |