2017-09-14 9 views
0

次のコードの実行順序は?Javaのi ++の実行順序は何ですか

私の理解で
if (hash[s.charAt(right++)]-- >= 1) 

1. hash[s.charAt(right)] >= 1 
2. hash[s.charAt(right)]-- 
3. right++; 

ありがとう!!!!

+3

Eclipseを開いてそのスニペットを貼り付け、コードを実行して結果/あなたの心を共有してください... –

答えて

1

if (hash[s.charAt(right++)]-- >= 1)のシーケンスを実行は、次のとおりrightright(C)

  • インクリメント値のs(B)
  • 読み取り値のhash(A)
  • 読み取り値の

    1. 読み取り値
    2. コールb.charAt(c)(d)
    3. a[d]のUE(E)a[d]
    4. デクリメント値e < f場合、一定1(F)
    5. スキップ過去ifブロックを読みます。 hashs、およびrightは3つのローカル変数である

    場合は、if文のバイトコードは次のとおりです。

    1: aload_1 
    2: aload_2 
    3: iload_3 
    4: iinc   3, 1 
    5: invokevirtual #21     // Method java/lang/String.charAt:(I)C 
    6: dup2 
        iaload 
    7: dup_x2 
        iconst_1 
        isub 
        iastore 
    8: iconst_1 
    9: if_icmplt  99 
    

    UPDATE

    効果が同じですあなたが書いたように:

    boolean cond = hash[s.charAt(right)]; 
    hash[s.charAt(right)]--; 
    right++; 
    if (cond) { 
    

    値は一度だけ読み込まれ、charAt()コールとインデックスルックアップは一度だけ発生します。

  • +0

    ありがとう! 'right ++ 'に等しいコードの上にあります。 if(hash [s.charAt(right)]> = 1); ハッシュ[s.charAt(右)] ++; '? – user8355591

    +0

    No. charAt()へのパラメータ値は、インクリメントの前の 'right' *の値です(ステップ2,3、および5)。ステップ4の増分は、「右」の値が取り出された後に起こる。 – Andreas

    +0

    このように? 'if(hash [s.charAt(right)]> = 1){ ハッシュ[s.charAt(right)] - ; right ++; } ' – user8355591

    関連する問題