文章

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 进行授权