Java中关于i=i++的正确解释方法

很多装B的地方,都会出这么一个问题:

int  i=0;

i = i++;

此时i为多少?

网上这个问题有很多解释,有的是完全错误的,有的不完全对,

在这里我想把最终正确的解释说一下,给那些还迷茫在这个问题中人一个答复。

我们都已经知道了,在java中,此时i的值是0 。答案稍后揭晓...

我们先来看一个问题:

int  i=0;

int  j=0;

j  = i++;

此时j的值是0;i的值是1。没有问题吧?

好多人的解释是这样的:

i 先赋值给j,此时i是0,所以j 是0;最后i再自增1,i 的结果是1。

这个解释从结果来看,没有问题,但是随后我会告诉你,这是错误的。

回到开头的问题,i为啥是 0 ?

我把代码反编译了一下,看了看Java虚拟机中运行过程,找到了答案。

反编译后的结果:

 

下面进行解释:

1:   iconst_0 //整型常量值0进栈

2:   istore_1 //将栈顶整型数值存入第二个局部变量

3:   iload_1 //第二个整型局部变量进栈

4:   iinc    1, 1 //指定整型变量增加指定值

5:   istore_1  //将栈顶整型数值存入第二个局部变量

 

看不懂?给你个图

 

如果是int j =0; int i=0; j = i++;

反编译后是这样的

7:   iconst_0  //整型常量值0进栈

8:   istore_2  //将栈顶整型数值存入第三个局部变量

9:   iconst_0  //整型常量值0进栈

10:  istore_3  //将栈顶整型数值存入第四个局部变量

11:  iload_3  //第四个整型局部变量进栈

12:  iinc    3, 1 //指定整型变量增加指定值

15:  istore_2  //将栈顶整型数值存入第三个局部变量

 

懂了吗?

 

结论:

(1)所有的自增运算都在赋值运算之前执行了,所以j=i++的多数人的解释是错误的,包括一些教科书。

(2)i++和++i在Java中的区别是:i++是先拷贝一份加入栈参与运算,后自增。

++i  是先自增,再拷贝一份加入栈参与运算。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值