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

来源:互联网 发布:杨丞琳长相知乎 编辑:程序博客网 时间:2024/05/04 16:37

很多装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  是先自增,再拷贝一份加入栈参与运算。

1 0