Java i=i++值的問題的解答 反編譯

  今天有朋友問我這樣的一個問題。java

  
  
           
  
  
  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。jvm

其實筆者一下也說不清楚,第一反應就是看看編譯後的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

這就好解釋了,查了一下,解釋以下:ide

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規範定義的。
 
本文出自 OneCoder我的博客,轉載請務必註明此連接: http://www.coderli.com/archives/java-i-jvm
相關文章
相關標籤/搜索