从底层了解自增运算符

3.8,彻底搞定++运算符

很多博客都在讲自增运算符,但是我当初始终感觉讲的不太清晰,于是乎便有了这一片文章,但是由于++操作涉及的知识点比较深,是由字节码搞的鬼,所以使用图和文字的形式去书写,希望对大家有所启发。

举例一

public void method7(){
    int i = 10;
    int a = i++;

    int j = 20;
    int b = ++j;
}



字节码如下
 0 bipush 10
 2 istore_1
 3 iload_1
 4 iinc 1 by 1
 7 istore_2
 8 bipush 20
10 istore_3
11 iinc 3 by 1
14 iload_3
15 istore 4
17 return
  1. bipush 10

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RyV73mMc-1646317566190)(JVM.assets/image-20220303220126447.png)]

  2. istore_1

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hUDdCPV0-1646317566191)(JVM.assets/image-20220303220445502.png)]

  3. iload_1

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TRWdQb2I-1646317566192)(JVM.assets/image-20220303220636921.png)]

  4. iinc 1 by 1

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WIHwooxq-1646317566192)(JVM.assets/image-20220303220842449.png)]

  5. istore_2

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XCSKe1aS-1646317566193)(JVM.assets/image-20220303221252892.png)]

  6. bipush 20(同上)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DW7ogZsV-1646317566193)(JVM.assets/image-20220303221342168.png)]

  7. istore_3

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ypa99WxK-1646317566193)(JVM.assets/image-20220303221422860.png)]

  8. iinc 3 by 1

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N4iT59oP-1646317566194)(JVM.assets/image-20220303221524796.png)]

  9. iload_3

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-teeKAwx2-1646317566195)(JVM.assets/image-20220303221605722.png)]

  10. istore 4

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nuT2FVyZ-1646317566195)(JVM.assets/image-20220303221736001.png)]

  11. return

上面的流程就是自增的字节码规定的流程图,总结一句话就是:

i++是先取出放入操作数栈后他才改变,i–是先改变然后才放入操作数栈进行复制。

同理有一道面试题目:

public void method8(){
        int i = 10;
        i = i++;
        System.out.println(i);//10
    }


 0 bipush 10
 2 istore_1
 3 iload_1
 4 iinc 1 by 1
 7 istore_1
 8 getstatic #2 <java/lang/System.out>
11 iload_1
12 invokevirtual #5 <java/io/PrintStream.println>
15 return
  1. 先往操作数栈中放入10

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m2spJO3a-1646317841132)(JVM.assets/image-20220303222824437.png)]

  2. 然后将其放入局部变量表想下标为1的地方

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BtcjwWd3-1646317841132)(JVM.assets/image-20220303222915971.png)]

  3. 然后将下标为1的局部变量表的值填写入操作数栈中

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BNjFiOQ3-1646317841133)(JVM.assets/image-20220303222940232.png)]

  4. 改变局部变量表下标为1的数字,为11

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EJPRMA3P-1646317841133)(JVM.assets/image-20220303222956252.png)]

  5. 然后将操作数栈中的数字出栈,并放入局部变量表中,即覆盖了原来的11,变为了10

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bByUyGBY-1646317841133)(JVM.assets/image-20220303223028670.png)]

这也就是之前有人常说的有一个局部变量的值覆盖了原有的值,这个局部变量的值就是操作数栈中先存入的值。
这也就是之前有人常说的有一个局部变量的值覆盖了原有的值,这个局部变量的值就是操作数栈中先存入的值。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值