i++と++iプローブ

6214 ワード

最初からプログラミングに触れて、i++と++iが違うと教えてくれた人がいましたが、なぜ違うのか教えてくれませんでした.ふふ~~
今日はなぜ違うのかを調べてみましょう.
 
まず、本文の核心ツール:javapコマンドを認識します.
JAvapはjdkが持参したツールで、逆コンパイルしたり、javaコンパイラが生成したバイトコードを表示したりすることができ、コードを分析する良いツールです.
これにより、ソースコードとバイトコードを照合し、多くのコンパイラ内部の作業を理解することができます.
JAvapコマンドフォーマット:
javap [ options ] class

オプション:
-l                         

-public            public    

-protected        public protected    

-package         ,public protected    ,     

-private               

-s                       

-c                       ,  ,        ,  java      ,

-verbose          ,                              


 OK、本題に戻ります.まずハローワードウィジェットを書きます
public class Hello {

    public static void main(String args[]){

        int i=2;

        i++;

        int j=1;

        ++j;

    }

}

コンパイルし、コンパイルが完了したら、次のコマンドを実行します.
javac Hello.java

javap -c Hello

次のような出力が得られます.
E:\>javap -c Hello

Compiled from "Hello.java"

public class Hello extends java.lang.Object{

public Hello();

  Code:

   0:   aload_0

   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V

   4:   return



public static void main(java.lang.String[]);

  Code:

   0:   iconst_2    // 2    

   1:   istore_1    //           1 , i 

   2:   iinc    1, 1    //    ,     1,   i,  1,            ,i    3 

5: iconst_1 // 1 6: istore_2 // 2 , j 7: iinc 2, 1 // 2, j , 1, ,j 2 10: return }

 
次に、このプログラムを見てみましょう.
public class Hello {

    public static void main(String args[]){

        int i=2;

        i=i++;

        int j=1;

        j=++j;

    }

}

この逆コンパイルの結果を見てみましょう.
E:\>javap -c Hello

Compiled from "Hello.java"

public class Hello extends java.lang.Object{

public Hello();

  Code:

   0:   aload_0

   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V

   4:   return



public static void main(java.lang.String[]);

  Code:

   0:   iconst_2  // 2    (  =2)

   1:   istore_1  //           1 , i (i=2,  =2)

   2:   iload_1   //     1  , 2    ,           2(i=2,  =2)

   3:   iinc    1, 1  //    ,     1,   i,  1,            ,i    3 (i=3,  =2)

   6:   istore_1  //           1 , i ,     2! (i=2,  =2)

7: iconst_1 // 1 ( =1) 8: istore_2 // 2 , j (j=1, =1) 9: iinc 2, 1 // 2, j, 1, ,j 2 (j=2, =1) 12: iload_2 // 2 , 2 (j=2, =2) 13: istore_2 // 2 , j , j=2 (j=2, =2) 14: return }