为什么i++后,i++的值不变

阅读: 评论:0

为什么i++后,i++的值不变

为什么i++后,i++的值不变

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所在的索引位置中去。

本文发布于:2024-02-01 10:00:58,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170675285635847.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23