ホームページ >Java >&#&チュートリアル >Javaの「i=i++;」の演算結果と動作原理を深く理解する

Javaの「i=i++;」の演算結果と動作原理を深く理解する

php是最好的语言
php是最好的语言オリジナル
2018-08-02 14:41:151782ブラウズ

Java の "i=i++;" について簡単に説明します

まず、コードは次のとおりです:

    public class Demo{
        public static void main(String []args){
            int i=12;
            i=i++;
            System.out.println(i);
        }
    }

ほとんどの生徒は 13 と答えるかもしれませんが、これは当てはまりません。以下の図に示されています:

Javaの「i=i++;」の演算結果と動作原理を深く理解する

上の図では、最初に実行した結果がわかりますが、ほとんどの人が推測したように、私たちの i は 13 として出力されませんが、これは自動実行されないようです。しかし、なぜこれが毛織物なのでしょうか?

それでは、Javap 命令を使用して逆コンパイルするという操作がありますが、JVM 命令についてよく理解していない人もいます。これは問題ではありません。コードに含まれる JVM 命令を最初に説明します。

(ここで重要な命令コードは main メソッドの後にあるため、次の命令のみを説明します。その前は、によって自動的に構築されるデフォルトの構築メソッドの命令コードです。仮想マシン)

1.bipush: 半角定数値(-128~127)をスタックの先頭にプッシュ
2.istore: スタックの先頭にあるint型の値を指定されたローカル変数に格納
3.iload: 指定された int 型のローカル変数を格納します スタックの先頭にプッシュします
4.iinc: この命令は、ローカル (ローカル) 変数に対して自動インクリメントおよびデクリメント演算を実行するために使用されます。この命令の最初のパラメータはローカル変数の数で、2 番目のパラメータは自動インクリメントとデクリメントの数です
5.getstatic 指定されたクラスの静的ドメインを取得し、その値をスタックの先頭にプッシュします (この位置に到達すると、静的オブジェクト out が呼び出されます。印刷操作については詳しく説明しません。興味のある方は、この記事の最後に添付されているリンクを参照してください)

基本的な手順を理解した後、上の図の重要な命令の意味:

  1. bipush 12 ここでは 12 をスタックの先頭にプッシュし、int 値を格納しています

  2. istore_1 ここでは 12 を 2 番目の命令にポップしています (注: 最初のローカル変数はこれである必要があります) ローカル変数は i=12

  3. iload_1 ここで 2 番目のローカル変数 (i) の値をスタックの先頭にプッシュしています。このとき、スタックの先頭は 12

  4. です。
  5. iinc 1,1. 当然、i=i+1、つまりi++です。このとき、i=13

  6. istore_1は、このとき、スタックの先頭の値をローカル変数iにポップします。 i には値 12

が割り当てられているため、最終的に出力されると、i は 12 になります。

CSDN 担当者が、クエリや学習に非常に便利な JVM 命令のコレクションをまとめました

関連記事:

i++ に関する関連質問

++i i++ と i++ の違い

関連ビデオ:


JAVA チュートリアル マニュアル

以上がJavaの「i=i++;」の演算結果と動作原理を深く理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。