21

私はJavaについていくつかの調査を行っていますが、これは非常に紛らわしいと思います:

for (int i = 0; i < 10; i = i++) {
  System.err.print("hoo... ");
}

これは終わりのないループです!

なぜそのようなことが起こるのか、誰にも良い説明がありますか?

4

5 に答える 5

38
for (int i = 0; i < 10; i = i++) {

上記のループは、基本的に次のものと同じです: -

for (int i = 0; i < 10; i = i) {

ステートメントの 3番目の部分-は次のように評価されます: -fori = i++

int oldValue = i; 
i = i + 1;
i = oldValue;  // 3rd Step 

機能させるには、そこから割り当てを削除する必要があります。

for (int i = 0; i < 10; i++) {

(コメントからのOPリクエストに応じて)

の挙動x = 1; x = x++ + x++;: -

コメントで指定された問題に関する限り、次の式の結果: -

x = 1; 
x = x++ + x++;

は次のように取得されます: -

2 番目のステートメントのさまざまな部分に印を付けましょう: -

x = x++ + x++;
R    A     B

ここで、最初に RHS 部分(A + B)が評価され、次に最終結果が に割り当てられxます。それでは、先に進みましょう。

最初Aに評価されます: -

old1 = x;  // `old1 becomes 1`
x = x + 1; // Increment `x`. `x becomes 2`
//x = old1; // This will not be done. As the value has not been assigned back yet.

Aさて、ここではtoの代入はしRていないので、3番目のステップは実行しません。

さて、評価に移りましょうB: -

old2 = x;  // old2 becomes 2. (Since `x` is 2, from the evaluation of `A`)
x = x + 1; // increment `x`. `x becomes 3`.
// x = old2; // This will again not be done here.

ここで、 の値を取得するには、とx++ + x++の評価で残した最後の割り当てを行う必要があります。そのためには、以下を置き換える必要があります: -ABx

A --> old1
B --> old2   // The last assignment of both the evaluation. (A and B)

/** See Break up `x = old1;` towards the end, to understand how it's equivalent to `A = old1; in case of `x = x++`, considering `x++ <==> A` in this case. **/

したがって、x = x++ + x++は次のようになります。

x = old1 + old2;
  = 1 + 2;
  = 3;  // Hence the answer

の 3 番目の部分を分割して、次の場合x = x++にどのように機能するかを確認しますx = x++ + x++: -

の場合のように、なぜ置換がではA --> old1なくとして行われるのだろうか。x --> old1x = x++

一部、特に最後の課題を詳しく見てみましょうx = x++: -

x = oldValue;

あなたがここにいると考えるならx++A上記の割り当ては次のステップに分けることができます: -

A = oldValue;
x = A;

さて、現在の問題については、次と同じです: -

A = old1;
B = old2;
x = A + B;

それが明確になることを願っています。

于 2013-01-28T21:12:15.743 に答える
8

post-increment: を使用しています。i = i++;これは次のような意味です。

temp = i;
i = i + 1;
i = temp;

15.14.2後置インクリメント演算子++のため:

後置インクリメント式の値は、新しい値が格納される前の変数の値です。

それがあなたが古い価値観を持っている理由です。

forループが正しく行われました:

for (int i = 0; i < 10; i++) {
  System.err.print("hoo... ");
}
于 2013-01-28T21:12:06.317 に答える
4

i=i++ のため

for (int i = 0; i < 10;  i++) {
  System.err.print("hoo... ");
}
于 2013-01-28T21:12:19.367 に答える
4

i++ は i の値を報告し、THEN はインクリメントします。これは、i を i++ に等しく設定する必要がないことも意味します。

for (int i = 0; i < 10; i++) {
于 2013-01-28T21:12:48.530 に答える