彻底搞定++ 自增运算符

主要是从字节码的角度去理解 ++

    public void test(){
        int i = 10;
        int j = 20;
        int a = i++;
        int b = ++j;
    }

代码对应的字节码指令

 0 bipush 10
 2 istore_1
 3 bipush 20
 5 istore_2
 6 iload_1
 7 iinc 1 by 1
10 istore_3
11 iinc 2 by 1
14 iload_2
15 istore 4
17 return

0:在操作数栈中push 一个值 10
2:从操作数堆栈中弹出值 10 并存储到局部变量表下标为1的地方(也就是i 的值)
3:在操作数栈中push 一个值 20
5:从操作数堆栈中弹出值 20 并存储到局部变量表下标为2的地方(也就是j 的值)
6:将局部变量表中下标为1处的局部变量的值(10)被压入操作数堆栈
7:局部变量表中索引为1处值 +1(此时局部变量表中i 的值为11)
10:从操作数堆栈中弹出值 10 并存储到局部变量表下标为3的地方(也就是a 的值)
11:局部变量表中索引为2处值 +1(此时局部变量表中j 的值为21)
14:将局部变量表中下标为2处的局部变量的值(21)被压入操作数堆栈
15:从操作数堆栈中弹出值 21 并存储到局部变量表下标为4的地方(也就是b 的值)

最后局部变量表中:
i:11
j:21
a:10
b:21

总结

a = i++表示先把i的值push操作数栈中,然后局部变量表中i进行自增操作,进行赋值操作,则表示将操作数栈中存的i的值(没有进行自增的值)赋值给a。

b = ++i表示先局部变量表中i进行自增操作,然后再将i的值push到操作数栈中,进行赋值操作,将操作数栈中存的i的值(进行了自增操作的值)赋值给b。

测试

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

此时i的值为多少呢?

 0 bipush 10
 2 istore_1
 3 iload_1
 4 iinc 1 by 1
 7 istore_1
 8 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;>
11 iload_1
12 invokevirtual #3 <java/io/PrintStream.println : (I)V>
15 return

输出打印的值为10。
push值为10到操作数栈中,
将10存放到局部变量表索引为1的地方(也就是i),
将i load到操作数栈中,
进行i自增(此时局部变量表中i的值为11,操作数栈中栈顶的值为10),
将操作数栈栈顶(10) 存放到局部变量表索引为1的地方(此时将之前的11进行了覆盖操作)
所以后面输出打印i 的值为10。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值