从字节码角度分析i++与++i以及i+=1与i=i+1运算操作

17 篇文章 0 订阅

变量的自增操作,如

  • i++
  • ++i
  • i+=1
  • i=i++

这些自增操作的算术运算可能计算的最后结果是一样,仅从代码层面很难看出它们的异同。下面将从字节码指令的角度去分析这些操作的不同之处。

i++++i的区别

如果只是进行变量的自增的运算,不涉及赋值操作,那么i++++i在字节码指令层面上是执行相同的指令
在这里插入图片描述
在这里插入图片描述
可以看出i++++i的字节码指令是一样的,都是先将操作数10压入操作数栈,然后保存到局部变量表索引为1的位置,也就是保存变量i的位置,然后将局部变量表索引为1的位置的变量的值加1

但是如果i++++i涉及到赋值操作,那么字节码指令就会有所不同

如果赋值操作是a = i++,执行的字节码顺序是:

  1. 将操作数10压入操作数栈
  2. 将操作数10保存到局部变量表索引为1的位置,即保存在变量i
  3. 将变量i的值重新压入操作数栈中(此时压入的是操作数还是10)
  4. 将变量i的值进行加1操作
  5. 最后把操作数栈中的操作数10保存到局部变量表索引为2的位置,即保存在变量a
    在这里插入图片描述

如果赋值操作是a = ++i,执行的字节码顺序是:

  1. 将操作数10压入操作数栈
  2. 将操作数10保存到局部变量表索引为1的位置,即保存在变量i
  3. 将变量i的值进行加1操作
  4. 将变量i的值重新压入操作数栈中(此时压入的是操作数是11)
  5. 最后把操作数栈中的操作数11保存到局部变量表索引为2的位置,即保存在变量a
    在这里插入图片描述
    二者不同之处在于iload_1iinc 1 by 1这两条指令的执行先后顺序,如果是a = i++运算,会先把i旧值压入操作数栈中,最后赋值给变量a,如果是a = ++i运算,会先进行加1操作,然后把加1后的新值压入操作数栈中,最后把新值赋值给变量a

i+=1i=i+1的区别

从字节码可以看出i+=1运算执行的是自增加1操作
在这里插入图片描述
i=i+1运算执行的是两个操作数相加add操作
在这里插入图片描述

i=i++运算

这个涉及到变量的自增以及赋值运算,和a=i++运算差不多,但是要注意的是变量i的值会发生覆盖

  1. 将操作数10压入操作数栈中
  2. 保存操作数10到变量i
  3. 将变量i的值重新压入栈中(此时压入栈中的操作旧值10)
  4. 变量i的值加1(此时变量i的值是11)
  5. 最后将操作数栈中的操作数10保存到变量i中(发生覆盖,操作数10覆盖了操作数11)
    在这里插入图片描述
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值