i++と++iプローブ
6214 ワード
最初からプログラミングに触れて、i++と++iが違うと教えてくれた人がいましたが、なぜ違うのか教えてくれませんでした.ふふ~~
今日はなぜ違うのかを調べてみましょう.
まず、本文の核心ツール:javapコマンドを認識します.
JAvapはjdkが持参したツールで、逆コンパイルしたり、javaコンパイラが生成したバイトコードを表示したりすることができ、コードを分析する良いツールです.
これにより、ソースコードとバイトコードを照合し、多くのコンパイラ内部の作業を理解することができます.
JAvapコマンドフォーマット:
オプション:
OK、本題に戻ります.まずハローワードウィジェットを書きます
コンパイルし、コンパイルが完了したら、次のコマンドを実行します.
次のような出力が得られます.
次に、このプログラムを見てみましょう.
この逆コンパイルの結果を見てみましょう.
今日はなぜ違うのかを調べてみましょう.
まず、本文の核心ツール: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
}