为什么i++后,i++的值不变
来源:互联网 发布:女生湿 知乎 编辑:程序博客网 时间:2024/05/16 01:38
i=0;
i=i++; // i = 0; i++ = 0
这两行代码运行在Java虚拟机栈中。
Java虚拟机栈(JVM Stack)描述的是Java方法执行的内存模型,而JVM内存模型是基于“栈帧”的,每个栈帧中都储存了方法的局部变量表、操作数栈、动态连接 和 方法返回的地址 。每个方法从调用开始至执行完成的过程,都对应着一个线帧在虚拟机栈里面从入栈到出栈的过程。
那么JVM是如何执行这个语句的呢?
以下是两行代码执行的源码:
0: iconst_0
1: istore_1
2: iload_1
3: iinc_1, 1
6: istore_1
7: iload_1
第0:将int类型的0入栈,就是放到操作数栈的栈顶
第1:将操作数栈栈顶的值0弹出,保存到局部变量表 index (索引)值为1的位置。(局部变量表也是从0开始的,0位置一般保存当前实例的this引用,当然静态方法例外,因为静态方法是类方法而不是实例方法)
第2:将局部变量表index 1位置的值的副本入栈。(这时局部变量表index为1的值是0,操作数栈顶的值也是0)
第3:iinc是对int类型的值进行自增操作,后面第一个数值1表示,局部变量表的index值,说明要对此值执行iinc操作,第二个数值1表示要增加的数值。(这时局部变量表index为1的值因为执行了自增操作变为1了,但是操作数栈中栈顶的值仍然是0)
第6:将操作数栈顶的值弹出(值0),放到局部变量表index为1的位置(旧值:1,新值:0),覆盖了上一步局部变量表的计算结果。
第7:将局部变量表index 1位置的值的副本入栈。(这时局部变量表index为1的值是0,操作数栈顶的值也是0)
由此可见,从执行顺序可以看到,这里第1和第6执行了2次将0赋值给变量i的操作(=号赋值),i++操作是在这两次操作之间执行的,自增操作是对局部变量表中的值进行自增,而栈顶的值没有发生变化,这里需要注意的是保存这个初始值的地方是操作数栈而不是局部变量表,最后再将栈顶的值覆盖到局部变量表i所在的索引位置中去。
阅读全文
0 0
- 为什么i++后,i++的值不变
- C#中i=i++值不变的一个解释
- i = i++为什么会是i原来的值??
- i = i++ 之后 i 的值为什么是 0
- i=i++表达式的值为什么没有变化?
- 为什么++i 优于 i++
- 前++(++i) 和 后++(i++)的区别
- java面试题inti=2;i+=i-=i*i的值以及关于i++;++i;i=i+1;i+=1 的效率问题
- i++ ,++i,i=i++的问题
- i++ ,++i,i=i++的问题
- i++;++i;i--;--i 的区别
- ++i,i++,--i和i--的区分
- i++ 、++i 、i-- 、--i 的效率问题
- JS for循环结束后i的值
- i++为什么不能作为左值?
- i++为什么不能作为左值?
- 为什么i++不能作为左值
- i++为什么不能作为左值?
- 互斥锁和条件变量在实际开发中的应用
- Python3 简单抓取网站url
- Maven基础
- Sass的使用(让css更优雅和强大)---第一节
- SQL之数据库的定义与基本操作
- 为什么i++后,i++的值不变
- Mybatis学习笔记(十三)【多对多查询】
- 软件架构师知识点2
- 有关map集合的理解
- nginx源码阅读(十四).惊群问题的解决
- 关于 JOptionpane的一些操作例子
- 微信小程序开发-图片(媒体)
- 【量化小讲堂-Python&Pandas系列06】历史数据告诉你:KDJ指标选股有效吗?
- 软件架构师知识点3