Java i=i++值的问题的解答 反编译
昨晚有朋友问我这样的一个问题。
1
2
3
4
5
6
7
8
9
10
/**
* @author lihzh
* @date 2012-6-8 下午9:21:22
* @blog http://www.coderli.com
*/
public static void main(String[] args) {
int i = 0;
i = i++;
System.out.println(i);
}
打印的结果为什么是 0。
其实我一下也说不清楚,第一反应就是看看编译后的class文件。
1
2
3
4
5
6
7
public static void main(java.lang.String[] args);
0 iconst_0
1 istore_1 [i]
2 iload_1 [i]
3 iinc 1 1 [i]
6 istore_1 [i]
7 getstatic java.lang.System.out : java.io.PrintStream [16]
这就好解释了:
1
2
3
4
5
6
iconst_0,将int值0压入操作数栈
istore_1,将栈顶的0弹出,赋给局部变量区1号索引的局部变量i
至此完成int i = 0
iload_1,将局部变量区1号索引的变量i值0压入操作数栈
iinc 1 1,将局部变量区1号索引的值加1,操作数栈不发生变化
istore_1,将栈顶的0弹出,赋给局部变量区1号索引的
至此完成i = i++,所以最后i的值为0
iinc 指令是直接对局部变量区进行操作,操作数栈不发生任何变化,这是由JVM规范定义的。
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
GESP 学习专题站:GESP WIKI
"luogu-"系列题目可在洛谷题库进行在线评测。
"bcqm-"系列题目可在编程启蒙题库进行在线评测。
欢迎加入:Java、C++、Python技术交流QQ群(982860385),大佬免费带队,有问必答
欢迎加入:C++ GESP/CSP认证学习QQ频道,考试资源总结汇总
欢迎加入:C++ GESP/CSP学习交流QQ群(688906745),考试认证学员交流,互帮互助
本文由作者按照 CC BY-NC-SA 4.0 进行授权
