バイトコードを分析することから、私は、私を++ ++区別します

++ / - 特別な算術演算子であり、それはオペレータに行われ、インクリメントデクリメント演算子はオペランドである算術演算で2つのオペランドを必要とします

接頭インクリメント(++):最初のインクリメント動作は、演算式のために、

後置インクリメント(++):式実行するオペレータ、およびその後の増分オペレータ。

        INT X = 5、Y = 5 int型、A = 2 * ++ X;
        int型、B = 2 * Y ++ ; 
        System.out.println( + "==" + B)。

出力:= 12、B = 10。 

++接頭辞、最初のインクリメント操作、=「= 2 * 6

+サフィックス、最初の計算式=「B = 10。

  

1      公共 ボイドprefixAdd(){
 2          のint = 100 iが3          I = ++ I;
4          のSystem.out.println(I)。
5      }
 6  
7      公共 ボイドpostfixAdd(){
 8          INT I = 100 9          私は++のI = 10          のSystem.out.println(I)。
11      }
 12  
13      公共 ボイドvarAdd(){
 14          のint I = 100 15          INT Y = I ++ 16         System.out.println(I + "==" + Y)。
17      }

 

ここで第二及び第三の方法をしつこいとの間の差の比較です。この必要性は、基礎となるデータにコンパイルバイトコードの分布を確認します。

 

 

 iload_1:ローカル変数のスタックフレームから読み取り、1インデックスを表します

istore_1:ローカル変数、インデックス1つの意味を保存します

IINC:ローカル変数の一定の値を加算し

接頭辞と接尾++ ++の違い:

 

 

 

 場合7行目、istore_1またはストレージ100に進み、ローカル変数の値は、101 1を上書きするように増加しています。だから、とき11行、再びiload_1または100。

 

 

 

 

 

線101は6読み出されてきたがラインプレフィックス+ 3ライン7は再び、101で、ローカル変数1に格納される11 101を読み出して、ローカル変数を増加させました。

 

サフィックス++:最初のローカル変数を読み、[ローカル変数を高めるために

プレフィックス++:ローカル変数を増加させ、その後、読み、最初。

 

  最初iload_1(I = 100)の変数値を使用して、第三の方法は、ローカル変数1の値が101であるistore_2ローカル変数に格納され、そして被覆されていません。

 

 

 

 

したがって、出力:

101
100
101 100 ==

私は++ =; ---> int型のy = I ++;この変化はよりよく理解することができ、私は++ =;なぜ私は100を=。

 

おすすめ

転載: www.cnblogs.com/song27/p/12359702.html