Java
很多装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全民到家同城服务按摩养生系统小程序源码