i++与++i的区别 面试题

自增和自减 其实就是操作局部变量表和数栈

举个例子:

public static void main(String[] args) {
        int i=1;
        i = i++;
        int j=i++;
        int k=i+ ++i * i++;
        System.out.println("i="+i);
        System.out.println("j="+j);
        System.out.println("k="+k);
    }

先给出结论,三个变量的值分别是 

i=4,j=1,k=11

那么问题来了,是怎么计算出来了的?

先看字节码文件:

0 iconst_1     1(int)值入栈

1 istore_1      将栈顶int类型值保存到局部变量1中

2 iload_1        从局部变量1中装载int类型值入栈

3 iinc 1 by 1   然后进行i++的操作 就是把值2放进局部变量表中 但是栈里的值还是1

6 istore_1       将栈顶int类型值保存到局部变量1中 所以 i的值又变成1了

7 iload_1        从局部变量1中装载int类型值入栈

8 iinc 1 by 1   然后进行i++的操作 就是把值2放进局部变量表中 所以i=2了 

11 istore_2    将栈顶int类型值保存到局部变量1中 因为 i的数栈还是1 1赋值给了j 所以j=1 而不是 i=1 (i=2)

(int k=i+ ++i * i++)这步比较麻烦 我们要先把值入栈 在做运算     

1.首先局部变量 的 i=2 那么 i 入栈第一个值是2

2.然后++i 先自增那么局部变量表的i=3 然后入栈 3  

3.i++ 先入栈 那么局部变量中的3 直接入栈 3 在自增 局部变量表 i=4

那么目前 栈中的值分别是 2 3 3 

然后我们要进行运算了 先进行乘法运算 3*3=9 因为9没办法赋值给变量所以也要先压入栈 

那么现在栈中的值分别是 2 9

在进行加法 9+2=11 那么栈中的值变成11了 

然后还有最后的= 操作 就是 把栈中的值11 赋值给k (k=11)

 

字节码文件:

 0 iconst_1
 1 istore_1
 2 iload_1
 3 iinc 1 by 1
 6 istore_1
 7 iload_1
 8 iinc 1 by 1
11 istore_2
12 iload_1
13 iinc 1 by 1
16 iload_1
17 iload_1
18 iinc 1 by 1
21 imul
22 iadd
23 istore_3

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值