很多老师告诉我们,i = i++ 的运算过程是 temp = i; i ++; i = temp; 以是i的值不变。但我总觉得这个temp的出现有些莫名其妙。以是在网上检索之后,把大佬们的解释做了一点总结和简化,权当拾人牙慧。要搞懂 i = i++ 我们先要简朴认识两个东西:局部变量表 和 操纵数栈。
以上次序的变化,实际上在JVM编译后的字节码文件中能够直观地看到,但是初学者对字节码很生疏,以是采用了以上的形貌方式。字节码的区别其实更加直观,如下:
- 执行 int i = 0;
- 把0这个常数放到操纵数栈中
- 从操纵数栈顶取出常数0,然后存储到局部变量表的索引为1的位置(局部变量表[1]),这个位置就代表i的值(因为局部变量表里有args 和 i 两个元素,args的索引是0)。
- 执行 i = i++;
- 盘算机起首看见右侧表达式中的i, 以是它把局部变量表[1]的值取出,压入操纵数栈。
- 盘算机又看见了符号“++”,于是把局部变量表[1]进行自增
- 然后盘算机看见 “=” ,以是对等号左边的i进行赋值,重点来了:
- 这里赋的是哪个值呢? -- 操纵数栈里的值,0。
- 那么赋值到哪里呢? -- 局部变量表[1]。直接覆盖了自增的结果,也就是说,刚刚的自增操纵,增了个寥寂。
- 以是我们就知道了:由于刚刚是“先压栈,再自增”,以是栈里的值还是原始值,最后又覆盖回去了。
- 同理,我们也就知道它和 i = ++i 的不同之处在哪里了
- 盘算机这次起首看见的是“++”符号,而不是i, 以是它这次先把局部变量表[1]进行自增
- 然后盘算机才看见了i,此时才把局部变量表[1]的值取出,压入操纵数栈,因此,栈里的值也变成了1,最后覆盖回去就是1。
这个问题的进阶另有 k = i + ++i * i++ 参考文章:https://blog.csdn.net/See_Star/article/details/125206538作者: 练块儿的程序员
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |