Java

发布时间:2024-11-12 13:12

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

网址:Java https://www.yuejiaxmz.com/news/view/55478

相关内容

JAVA题目
Java 在生活中的 10 大应用
java健康饮食管理系统(ssm)
Java HotSpot(TM) 64
【Java数据结构】字符串常量池
Java程序员不得不会的124道面试题(含答案)
java连接mysql错误及解决方案整合
java毕业设计宠物领养小程序[附源码]
JAVA软件开发人员
JAVA全民到家同城服务按摩养生系统小程序源码

随便看看