i++与++i在虚拟机层面上的骚操作-每天一个面试小细节

i++与++i在虚拟机层面上的骚操作:

很多人都会有这样一个理解误区:认为i++和++i是从虚拟机栈中取出i的初始值执行计算后再入栈,其实不然:
i++与++i都仅仅在局部变量表上执行+1操作,也就是说仅仅更新局部变量表

又如int i = 1;i=i++;这段代码在虚拟机的执行过程如下:
bpush 1将1入栈,由于i = 1有赋值操作,就会istore_1将栈顶元素,即1从栈中弹出存入局部变量表槽1的位置;接着i++会执行两步操作:1.iload将局部变量表中槽1的位置的值(1)复制到栈顶,2.直接在局部变量表槽1的位置执行+1操作,此时局部变量表槽1的位置的值更新为2;最后,由于i=i++有赋值操作,就会istore_1将栈顶元素,即1从栈中弹出存入局部变量表槽1的位置(1);

既然有i++那么必然有++i,例如int i = 1;i=++i;执行过程:
bpush 1将1入栈,由于i = 1有赋值操作,就会istore_1将栈顶元素,即1从栈中弹出存入局部变量表槽1的位置;接着
i++会执行两步操作:1.直接在局部变量表槽1的位置执行+1操作,此时局部变量表槽1的位置的值更新为2,2.iload_1将局部变量表中槽1的位置的值(2)复制到栈顶
;最后,由于i=i++有赋值操作,就会istore_1将栈顶元素,即1从栈中弹出存入局部变量表槽1的位置(2);
再来一个深入的例子:

int i = 0;
i = 5+ i++;

执行过程如下:
bpush 1将0入栈,由于i = 0有赋值操作,就会istore_1将栈顶元素,即1从栈中弹出存入局部变量表槽1的位置;然后,iconst_5将5入栈,至于i++的两个操作(可以看成原子操作),1.iload_1先将将局部变量表中槽1的位置的值(0)复制到栈顶,2.直接在局部变量表槽1的位置执行+1操作,此时局部变量表槽1的位置的值更新为1;最后iadd从栈中弹出两个操作数5和0相加得到5,入栈,由于i = 5+ i++;有赋值操作,istore_1将栈顶元素,即5从栈中弹出存入局部变量表槽1的位置(5),此时槽1中1变为5;
对应的++i:

int i = 0;
i = 5+ ++i;

执行过程如下:
bpush 1将0入栈,由于i = 0有赋值操作,就会istore_1将栈顶元素,即1从栈中弹出存入局部变量表槽1的位置;然后,iconst_5将5入栈,至于i++的两个操作(可以看成原子操作),1.直接在局部变量表槽1的位置执行+1操作,此时局部变量表槽1的位置的值更新为1,2.iload_1先将将局部变量表中槽1的位置的值(1)复制到栈顶;最后iadd从栈中弹出两个操作数5和1相加得到6,入栈,由于i = 5+ ++i;有赋值操作,istore_1将栈顶元素,即6从栈中弹出存入局部变量表槽1的位置(6),此时槽1中1变为6;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fire king

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值