今天有朋友问我这样的一个问题。

 
  1.  /** 
  2. * @author lihzh 
  3. * @date 2012-6-8 下午9:21:22 
  4. * @blog http://www.coderli.com 
  5. */ 
  6. ublic static void main(String[] args) { 
  7. int i = 0
  8. i = i++; 
  9. System.out.println(i); 

 打印的结果为什么是 0。

其实笔者一下也说不清楚,第一反应就是看看编译后的class文件。
 
 
  1. public static void main(java.lang.String[] args); 
  2.     0  iconst_0 
  3.     1  istore_1 [i] 
  4.     2  iload_1 [i] 
  5.     3  iinc 1 1 [i] 
  6.     6  istore_1 [i] 
  7.     7  getstatic java.lang.System.out : java.io.PrintStream [16

这就好解释了,查了一下,解释如下:

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++,所以最后i的值为0 
 
 
iinc 指令是直接对局部变量区进行操作,操作数栈不发生任何变化,这是由JVM规范定义的。
 
本文出自 个人博客,转载请务必注明此链接: