ToB企服应用市场:ToB评测及商务社交产业平台

标题: Java变量自增表达式 i = i++ 的底层逻辑(简述) [打印本页]

作者: 来自云龙湖轮廓分明的月亮    时间: 2024-5-19 17:32
标题: Java变量自增表达式 i = i++ 的底层逻辑(简述)
Java变量自增表达式 i = i++ 的底层逻辑(简述)

媒介

很多老师告诉我们,i = i++ 的运算过程是 temp = i; i ++; i = temp; 以是i的值不变。但我总觉得这个temp的出现有些莫名其妙。以是在网上检索之后,把大佬们的解释做了一点总结和简化,权当拾人牙慧。
要搞懂 i = i++ 我们先要简朴认识两个东西:局部变量表操纵数栈
正文

了解了以上内容,就可以对i=i++进行理解了。不过在此之前,我们先看看单独的i++ 和 ++i的区别:
i++ 和 ++i

i++ 和 ++i,它们实际上是直接在局部变量表里修改变量的值,原地修改,不需要颠末操纵数栈。以是,作为语句单独使用时,没有区别。
  1. public static void main(String[] args) {
  2.     int i = 0;
  3.     i++; // 在局部变量表直接自增
  4.     ++i; // 在局部变量表直接自增,没有区别
  5. }
复制代码
那么当情况是 i = i++时; 为什么结果就是i的值不变呢?
i = i++
  1. public static void main(String[] args) {
  2.     int i = 0;
  3.     i = i++; // i值不变
  4. }
复制代码
这就是操纵数栈参与的结果,上面代码的执行过程,实际上是如许的:

以上次序的变化,实际上在JVM编译后的字节码文件中能够直观地看到,但是初学者对字节码很生疏,以是采用了以上的形貌方式。字节码的区别其实更加直观,如下:
  1. iconst_0  # 把int常量0压入操作数栈
  2. istore_1  # 把操作数栈顶的值"0"存储到局部变量表[1]
  3. iload_1   # 局部变量表[1]的值压入操作数栈顶,此时操作数栈顶为0
  4. iinc 1 1  # 将局部变量表[1]的值,加上1, 所以此时i的值变成1
  5. istore_1  # 将操作数栈顶的值存储到局部变量表[1], 用0覆盖了1.
复制代码
  1. iconst_0  # 同上
  2. istore_1  # 同上
  3. iinc 1 1  # 将局部变量表[1]的值,加上1, 此时i的值变成1
  4. iload_1   # 局部变量表[1]的值压入操作数栈顶,此时操作数栈顶为1
  5. istore_1  # 将操作数栈顶的值存储到局部变量表[1], 用1覆盖了1.
复制代码
这个问题的进阶另有 k = i + ++i * i++ 参考文章:https://blog.csdn.net/See_Star/article/details/125206538
            作者: 练块儿的程序员   
            出处:https://www.cnblogs.com/sunyujun16   
        本文版权归作者和博客园共有,欢迎转载,但必须保留此段声明,且在文章页面明显位置给出原文链接, 如有问题,可邮件sunyujun16@163.com咨询.   

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4