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 是先自增,再拷贝一份加入栈参与运算。
- Java中关于i=i++的正确解释方法
- java 中 i=i++ 的解释
- java 中 i=i++ 的解释
- java 中 i=i++ 的解释
- java中 i=i++的解释
- java 中 i=i++ 的解释
- Java 语言中 关于 i=i++ 表达式的规范解释
- Java中对i = i++的解释
- 关于java中i++,++i和i++ + ++i的问题
- java 中关于i = i++; 的bug
- 关于java中i=i++的问题
- java中i++ ++i字节码解释
- VC 中关于a=(i++)+(++i)+(i++)的分析
- C#中i=i++值不变的一个解释
- 关于java I/O中flush方法作用的理解
- java中i = i++的思考?
- java中i=i++的问题
- java中i=i++的问题
- 使用Genymotion调试出现错误INSTALL_FAILED_CPU_ABI_INCOMPATI
- Unity Profiler之Android真机调测
- string专题(c++)【1】
- ant 编译打包
- ActiveMQ 安装配置
- Java中关于i=i++的正确解释方法
- 正则表达式语法
- 关于使用git进行代码托管下文件的恢复
- 从request获取各种路径总结
- System.exit()和return区别
- map(c++)
- dockerfile的一些经验吧
- HDU 3001 Travelling(状态压缩dp)
- An overview of the contrib modules and a small explanation of opencv_contrib