5

この動作の背後にあるロジックは何ですか?

 int i=0;
    for(int k=0;k<10;k++){
    i++;
    }
    System.out.println("i="+i);

Output=10; //Exepcted



 int i=0;
    for(int k=0;k<10;k++){
    i=i++;
    }
    System.out.println("i="+i);

Output=0; //Surprised :) 

誰かが上記の機能に光を当てることができますか?

4

8 に答える 8

6

i = i++は後置インクリメント演算子です。これは をインクリメントiしてから元の値に戻します ( は本質的にインクリメントされる前i++の の値を「返す」ためです)。i

i = ++iこれはプレフィックスインクリメント演算子であるため機能し、インクリメント後に I の値を返します。i++ただし、最初の実行で行うように、余分な割り当てを行わずにそこで実行したいだけですi = i+1

于 2013-05-02T10:21:46.970 に答える
4

Javaが値渡しであるため、何が起こっているのかが起こります。

最初のループでは、ステートメントi内でインクリメントされますが、2 番目のループでは、値(この場合は 0)を格納する新しいメモリ ロケーションがポイントされ、古いロケーションがインクリメントされます。i++ii

視覚化するには:

i => 0x00000001 // 0

for() {
    i => 0x00000002 <- 0  // store old i value (0) in new location
    0x00000001++          // Increment the value stored at the old location

    // Cause there is no longer a reference to 0x00000001, 
    // it will get garbage collected and you will be left with
    // i => 0x00000002

そして、古い値を新しい場所に割り当て、ループのパスごとに古い値をインクリメントしながら、それを続けます。

于 2013-05-02T10:22:10.453 に答える
1

++ 演算子は代入に処理され、

変更したi=++i;場合、おそらく期待した動作が得られるでしょう

于 2013-05-02T10:22:24.733 に答える