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规范定义的。
本文由作者按照 CC BY 4.0 进行授权