ホームページ >Java >&#&チュートリアル >Javaの「i=i++;」の演算結果と動作原理を深く理解する
まず、コードは次のとおりです:
public class Demo{ public static void main(String []args){ int i=12; i=i++; System.out.println(i); } }
ほとんどの生徒は 13 と答えるかもしれませんが、これは当てはまりません。以下の図に示されています:
上の図では、最初に実行した結果がわかりますが、ほとんどの人が推測したように、私たちの i は 13 として出力されませんが、これは自動実行されないようです。しかし、なぜこれが毛織物なのでしょうか?
それでは、Javap 命令を使用して逆コンパイルするという操作がありますが、JVM 命令についてよく理解していない人もいます。これは問題ではありません。コードに含まれる JVM 命令を最初に説明します。
(ここで重要な命令コードは main メソッドの後にあるため、次の命令のみを説明します。その前は、によって自動的に構築されるデフォルトの構築メソッドの命令コードです。仮想マシン)
1.bipush: 半角定数値(-128~127)をスタックの先頭にプッシュ
2.istore: スタックの先頭にあるint型の値を指定されたローカル変数に格納
3.iload: 指定された int 型のローカル変数を格納します スタックの先頭にプッシュします
4.iinc: この命令は、ローカル (ローカル) 変数に対して自動インクリメントおよびデクリメント演算を実行するために使用されます。この命令の最初のパラメータはローカル変数の数で、2 番目のパラメータは自動インクリメントとデクリメントの数です
5.getstatic 指定されたクラスの静的ドメインを取得し、その値をスタックの先頭にプッシュします (この位置に到達すると、静的オブジェクト out が呼び出されます。印刷操作については詳しく説明しません。興味のある方は、この記事の最後に添付されているリンクを参照してください)
基本的な手順を理解した後、上の図の重要な命令の意味:
bipush 12 ここでは 12 をスタックの先頭にプッシュし、int 値を格納しています
istore_1 ここでは 12 を 2 番目の命令にポップしています (注: 最初のローカル変数はこれである必要があります) ローカル変数は i=12
iload_1 ここで 2 番目のローカル変数 (i) の値をスタックの先頭にプッシュしています。このとき、スタックの先頭は 12
iinc 1,1. 当然、i=i+1、つまりi++です。このとき、i=13
以上がJavaの「i=i++;」の演算結果と動作原理を深く理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。