i++为什么没有自增探析——JVM中i++的实现(转)

很多朋友在使用Java时候会发现一个很奇怪的现象。

那就是使用下列的短句时会发现i没有自增,这是很让人迷惑的,因为大家印象中,虽然i++优先级较低,但是总是会自增的,这里为什么i++没有自增?

  1. i=i++;

实质上我们可以将i++与++i对比下

i++的情况

  1. iload_1
  2. iinc 1,1
  3. istore_1

++i的情况

  1. iinc 1,1
  2. iload_1
  3. istore_1

jvm里面有两个存储区,一个是暂存区(是一个堆栈,以下称为堆栈),另一个是变量区。

语句istore_1是将堆栈中的值弹出存入相应的变量区(赋值);语句iload_1是将变量区中的值暂存如堆栈中。

i = i++;是先将i的值(0)存入堆栈,然后对变量区中的i自加1,这时i的值的确是1,但是随后的istore_1又将堆栈的值(0)弹出赋给变量区的i,所以最后i = 0。

而i = ++i;是先对变量区中的i自加1,然后再将变量区中i的值(1)存入堆栈,虽然最后执行了istore_1,但也只是将堆栈中的值(1)弹出赋给变量区的i,所以i = ++i;的结果是i = 1。

下面这张图就反映了i++的简单流程,先将变量区的i值存入堆栈区,变量区的i再自增1,最后由于是赋值操作,从堆栈区取出i值赋给变量区。因此i依然为最开始保存在堆栈区的i值。

而如果是赋值给其他的变量呢?为什么i++能够实现自增呢?这里我们举出一个语句的例子:

  1. j=i++;

具体过程看下面的图就会明白了.

转载地址:http://blog.csdn.net/learn_computer/article/details/38498945

时间: 2024-10-22 20:51:26

i++为什么没有自增探析——JVM中i++的实现(转)的相关文章

构造方法探析

构造方法探析 编译环境 Windows 10 Pro jdk1.8.0_91 如果没有特殊说明,下面程序都有javac.java的编译运行过程. 构造方法的特点 方法名与类名相同. 不用定义返回值类型. 没有具体的返回值. 此次整理是按照知识点具体为例子的方式. 当没有写构造方法时,Java虚拟机默认会创建一个空构造 ClassDemo1.java class ClassDemo1{ public static void main(String[] args){ //new 关键字后面跟的必须是

读后感(一) web运作原理探析

tomcat与java web开发技术详解之web运作原理探析 成为一名web开发工程师,首先要明白web运作原理,原理可以带我们更好的去解决底层问题,怎么去理解现在流行的开源框架,甚至如何去自己写一个框架. 1 什么是web? web是网络上使用最广泛的分布式框架.它采用了客户端/服务器的通信模式,客户端可以是浏览器,通过浏览器它就可以连接服务器,访问许多服务器浏览各种各样的网站,这也是为什么说web是一种分布式的运用框架了. 2 URL 我们访问一个网站的时候会在浏览器显示一个网站地址,比如

合并财务报表分步合并与一次合并的差异探析

多层控股关系下,集团编制合并报表的顺序采用一次合并法还是分步合并法,两者的结果是否相同,其使用有否受到限制,实务中存在疑惑.本文着重分析在抵销内部交易未实现损益.同一控制下企业合并.购买子公司少数股权等事项中,不同合并顺序的应用及其对于合并报表权益结构的影响,探讨在实务中如何消除因合并顺序不同而引发的差异,以提高合并报表的编制质量. 一.多层控股关系下有关合并报表顺序的两种方法 当存在多层控股关系时,编制合并报表的合并顺序一般有分步合并和一次合并两种方法. (一)分步合并法 分步合并法,指企业存

【转】代码签名探析

转至:objc中国 代码签名探析 dopcn  15 Oct 2014 分享文章 "用户会感激代码签名带来的好处" – Apple Developer Library: Code Signing Guide 在 iOS 或 OS X 平台上进行应用开发时,你所需要使用的 API 大多设计得简洁明了.你可以轻易地实现酷炫的动画效果,便捷地进行应用发布前测试,或是用 Core Data 将数据安全的存储在本地.但是总有一天,你会碰上代码签名 (code signing) 和配置文件 (pr

浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入

在<浏览器环境下JavaScript脚本加载与执行探析之defer与async特性>中,我们研究了延迟脚本(defer)和异步脚本(async)的执行时机.浏览器支持情况.浏览器bug以及其他的细节问题.而除了defer和async特性,动态脚本和Ajax脚本注入也是两种常用的创建无阻塞脚本的方法.总的来看,这两种方法都能达到脚本加载不影响页面解析和渲染的作用,但是在不同的浏览器中,这两种技术所创建的脚本的执行时机还是有一定差异,今天我们再来探讨一下通过动态脚本技术和Ajax注入的脚本在这些方

深入探析 Rational AppScan Standard Edition 多步骤操作

序言 IBM Rational AppScan Standard(下文简称 AppScan)作为面向 Web 应用安全黑盒检测的自动化工具,得到业界的广泛认可和应用.很多人使用 AppScan 时都采用其强大的手工探索加自动探测的方式,然而这种方式并不适用于所有场景.使用 AppScan 进行安全扫描时,我们必须保证 AppScan 探索出来的 URL 的有效性(尤其是用户想导出这些探索结果以供复用的情况下),有效性即指该 URL 对应的 HTTP 请求能被服务器端接受并按照期望的方式进行处理.

[置顶] 深入探析Java线程锁机制

今天在iteye上提了一个关于++操作和线程安全的问题,一位朋友的回答一言点醒梦中人,至此我对Java线程锁有了更加深刻的认识.在这里也做个总结供大家参考. 先看几段代码吧! 代码一: [java] view plaincopy public class TestMultiThread2 implements Runnable{ private static Object o = new Object(); private static Integer si = 0; private stati

广播探析

一.几种特殊的IP地址 如图所示,在表格的下半部分有四种特殊的广播地址.分别为受限的广播地址.指向网络的广播.指向子网的广播.指向所有子网的广播.由于对其概念,以及相应子网掩码的概念理解不是很透彻,这次探析给了我很大的帮助. 一.体会这四种广播 以网络地址为142.1.2.3为例 ①             若掩码为255.255.128.0 我们可以获知在该IP的所有子网为142.1.0.0,142.1.128.0. 因此,该地址的广播地址为142.1.127.255,而142.1.255.2

云桌面及桌面虚拟化中的安全问题探析

安全问题一直作为云计算平台的重中之重,本文探析了云桌面及桌面虚拟化中的安全问题. 数据泄露防护(Data leakage prevention, DLP),又称为"数据丢失防护"(Data Loss prevention, DLP)是指通过IT技术方式,防止企业指定的数据信息的非法被策略规定以外的第三方获取.目前Symantec.Macafee等国际企业,以及中软.伊时代.圣博润等国内厂商都有相应的数据防泄密产品方案. 同时,根据诸多IT调研机构的报告显示,该市场在2010年至2020