一般に、Pre-Position ++は最初に変数の値を1に追加し、次に1を追加して操作に参加した後に値を使用すると考えられています。一方、ポストポジション++は最初に値を使用して操作に参加し、次に値を1に追加します。
最初の例を見てみましょう。
パッケージテスト; public class plus_test01 {public static void main(string [] args){int i = 100; i = i ++; System.out.println(i); }}結果は何だと思いますか?
2番目のものを見てみましょう:
パッケージテスト; public class plus_test02 {public static void main(string [] args){int k = 100; while(true){if(k ++> 100){// system.out.println(k);壊す; } system.out.println(k); }}}結果は何だと思いますか?
実際、それがpre- ++であろうとpost- ++であろうと、変数の値は最初に1だけ増加してから計算を続けます。 2つの真の違いは次のとおりです。Pre-++は変数の値を1で追加し、追加値を使用して計算を実行し、Post-++は最初に変数を一時変数に割り当て、次に変数の値に1を追加し、その一時変数を使用して計算を実行します。
次のコードスニペット(プレフィックス++)について:
int i = 1;
int j = ++ i*5;
実際、2番目の文は次のとおりです。
i+= 1; // 1を1に追加します
j = i*5; // 1を追加した後に値を計算すると、結果は次のとおりです。
次のコードスニペット(POST- ++)について:
int i = 1;
int j = i ++*5;
2番目の文は次のようです。
int temp = i; // Iを一時変数に割り当てます
i+= 1; // 1を1に追加します
j = temp*5; //一時変数を計算すると、結果は次のとおりです。
最初の例では、次のものと同等です。
int temp = i;
i+= 1;
i = temp; //
したがって、結果は変更されていません、つまり100です。
最初の例のアセンブリコードは次のとおりです。
public static void main(java.lang.string []);記述子:([ljava/lang/string;)v flags:acc_public、acc_static code:stack = 2、locals = 2、args_size = 1 0:bipush 100 2:iload_1 4:iinc 1、1 // local var plus 16:istore_1 // java/lang/system.out:ljava/io/printstream; 11:iload_1 //ロードされたパラメーターはスタックの2番目です。つまり、それはまだ100 12:invokeVirtual#22 //方法Java/io/printstream.println:(i)v 15:return
2番目の例では、実際には難しくありませんが、結果は101です。プロセスに注意を払い、将来そのような間違いを犯すことはできません。 (プロセスは次のとおりです。最初のtemp = i、temp> 100、明らかに当てはまりません。もちろん、シソの文に+= 1をスキップします。もちろん、101を印刷し、再びループします。
2番目の例の編集(メインメソッドのみが選択されます):
public static void main(java.lang.string []);記述子:([ljava/lang/string;)v flags:acc_public、acc_static code:stack = 2、locals = 2、args_size = 1 0:bipush 100 // 100プッシュスタック2:istore_1 // 2番目のローカルvarに保存(最初のローカルvar)ローカルVARの位置2(ローカル変数が増加し、結果はまだローカルVARにあり、オペランドスタックのトップ1は変更されません) 1>オペランドスタックTOP 2)15:GetStatic#2 // Field Java/Lang/System.out:ljava/io/printStream; 18:iload_1 // //最初のローカルVar 19からのロード19:invokevirtual#3 // method java/io/printstream.println:(i)v //この方法を呼び出す22:goto 3 //再びジャンプ、ループ25:return // exit
3番目の例:
パッケージテスト; public class plus_test03 {static int proplus(){int i = 55; int j = ++ i; j; // 56} static int postplus(){int i = 55; int j = i ++; j; // 55} public static void main(string [] args){system.out.println(proplus()); // 56 system.out.println(postplus()); // 55}}}3番目の例の編集:
static int proplus();記述子:()Iフラグ:acc_static code:stack = 1、locals = 2、args_size = 0:bipush 55 // 55 stack 2:istore_0 // int stackの上部への上部3:iinc 0、1 //最初のローカルvarプラス1 6:iload_0 //ローカルヴァル7:istore_1 // ILOAD_1 //スタックの上部は、2番目のローカルVAR 9:IRETURNSTATIC INT POSTPLUS()です。記述子:()Iフラグ:acc_static code:stack = 1、locals = 2、args_size = 0:bipush 55 2:istore_0 3:iload_0 // stack 4:iinc 0、1 //最初のローカルバルプラス1 7:iload_1 8:iload_1 9:iLeturn_9:Iload_1
フロント++とリア++の違いは、上の青い部分であることがわかります(//最初のローカルvarプラス1)。前身の場合、ローカルVARの数が1を追加してからスタックにロードされ、後者はスタックのローカルVARからスタックにロードされ、ローカルVARが追加されます。
結論は:
1つ。事前位置とポジション++は両方とも、最初に1を追加してから計算するのではなく、最初に1を変数値に1を追加します。
二。プログラム的に言えば、投稿 - ++は最初に変数を一時変数に割り当て、次に変数の値を1で追加し、次に一時変数を使用して操作に参加します。
三つ。命令の観点から、バリューアドレス命令(IINC)を実行する前に、変数の値がスタックにプッシュされます。付加価値のある命令を実行した後、スタックに押し込まれた値が使用されます。
この記事を通して、Pre-Position ++とポストポジション++操作の違いを徹底的に理解することを願っています。このサイトへのご支援ありがとうございます!