简单讲一下,x=x++为何自增不起作用。

首先看下i=i++的字节码:

iconst_0:表示生成一个常量0,放入操作数栈

istore_1:表示将操作数栈顶元素存入局部变量表1号位置。

iload_1:表示将局部表1号位置的变量值,压入操作数栈

iinc:自增1


图中应该是int i =0(勘误),并且省略了局部变量表0号位置。

所以最终的原因在于:
赋值操作导致操作数栈中的值,覆盖了原本已经自增的局部变量。

这也是大家所说的中间变量缓存机制。

所以大家可以好好回味一下,x++:先运算,再自增,这句话的含义了。

先运算,表示先将x压入操作数栈,参与下一次使用到此变量的运算。

而离谱的是,赋值操作的优先级低于自增运算符,所以在自增操作完成后,变量才被赋值。

结果上看,似乎是先自增,后运算。

所以可以理解为变量为就绪态,先运算表示先将变量变为就绪态,并不是表示运算一定在自增前面。

以上只是一点小思考,大家不要真的以为变量有就绪态,而且“先运算,后自增”本身似乎也没有原文支撑,只是大家的总结,所以大家还是要以事实为依据,自己去探寻真理。

附上反编译字节码命令:

javap -v xxx.class

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值