java中,i++自增运算符的JVM层面以及代码层面分析

大家好,我是【八戒,你又涨价了哎】

以下是我个人在学习过程中的分享,请大家多多指教

一、问题提出

       我们知道, java中自增运算符++或--,运算符在变量之前,先自增或减,再赋值。运算符在变量之后,先赋值,再自增或减

那么下面这段代码的结果是什么?

int i  = 1;
i = i++;
System.out.println(i);

答案是 1

为什么呢?

二、分析以及结论

1、首先从JVM层面分析

        通过javap -c 来查看其对应的 JVM 字节码得到

        分析

0: iconst_1       // 将常量1推送到操作数栈中
1: istore_1       // 将栈顶的值存储到局部变量i
2: iload_1        // 将局部变量i的值加载到操作数栈中
3: iinc 1, 1      // 对局部变量i自增1
6: istore_1       // 将栈顶的值(自增之前的值)存储回局部变量i
7: getstatic      // 获取静态字段System.out
10: iload_1       // 将局部变量i加载到操作数栈中
11: invokevirtual // 调用println方法输出i的值

        通俗解释来说,就是JVM会使用一个临时变量来接收 i 的值,然后进行自增运算

2、从代码的执行步骤层面分析

  1. i++ 是后置自增操作符,意思是先使用变量 i 的当前值,然后再将 i 自增 1
  2. 在执行 i = i++ 时,以下步骤会依次发生:
    1. 首先,表达式右边的 i++ 的当前值(此时 i = 1)被存储。
    2. 然后 i 自增 1,此时 i 实际变成 2
    3. 接下来,= 赋值操作会把之前存储的 1 重新赋值给 i,覆盖掉自增后的 2

因此,虽然 i 自增了,但赋值操作最终将 i 重新赋值为自增前的值,即 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值