从jvm角度深入理解i++ ++i 区别

测试类

package com.company;

public class Main {

        public void testIPlus() {
            int i = 0;
            int j = i++;
        }

        public void testPlusI() {
            int i = 0;
            int j = ++i;
        }

    public static void main(String[] args) {

    }

    }


javap -v 反汇编后

  public void testIPlus();
    descriptor: ()V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=3, args_size=1
         0: iconst_0 将int类型常量0压入栈 
         1: istore_1 取出栈顶元素存入局部变量1 
         2: iload_1 把局部变量1压入栈(此时局部变量1的值为0)
         3: iinc          1, 1  把一个常量值加到一个int类型的局部变量上 (局部变量1值加1)
         6: istore_2  取出栈顶元素存入局部变量2
         7: return
      LineNumberTable:
        line 6: 0
        line 7: 2
        line 8: 7

  public void testPlusI();
    descriptor: ()V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=3, args_size=1
         0: iconst_0  将int类型常量0压入栈 
         1: istore_1     取出栈顶元素存入局部变量1 
         2: iinc          1, 1  把一个常量值加到一个int类型的局部变量上 (局部变量1值加1)
         5: iload_1     把局部变量1压入栈(此时局部变量1的值为0+1)
         6: istore_2  取出栈顶元素存入局部变量2
         7: return
      LineNumberTable:
        line 11: 0
        line 12: 2
        line 13: 7

2: iload_1   3: iinc      区别就是这两条指令的执行顺序 i++ 先把i的值压入操作数栈在加一 ++i 先把i加一再把i的值压入操作数栈

局部变量1就是i 局部变量2就是j  局部变量赋值的过程其实是从栈顶取值 这也是为什么导致 i++ 是先执行后加一  ++i 先加一后执行的原因 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值