1
int i = 3, j = 3;
for (; i++ == j--; i += 2, j -= 2) {
    do {
        i = i + j;
    } while (i % j != 0);
}
System.out.println(i);
System.out.println(j);

Eclipseでデバッグしてみましたが、結果は次のとおりです。

  • 私、j
  • 3,3
  • 4,2
  • 6,2
  • 9,-1

前回の for ループは i と j の値をチェックしたので、それらは互いに等しくありませんでしたが、なぜループから抜け出したのでしょうか? 無限ループになりませんか?

4

4 に答える 4

1

それらは互いに等しくなかったので、ループは終了しました。それらが等しい場合、ループは終了しません。これがあなたの条件です。

于 2013-02-21T06:20:51.483 に答える
1
for (; ++i != --j; i += 2, j -= 2) {}

++i != --jまたはi++ != --jまたはを条件++i != j--にすると、無限ループが発生します。

i++ と j-- はどちらもそれぞれポスト インクリメントとデクリメントであるため、最初に条件をチェックし、後で値をインクリメントします。

于 2013-02-21T06:23:35.683 に答える
1

いいえ、無限ループには入りません
。 1. i と j が初期化されます (i=3、j=3)
2. 条件がチェックされます。そして、条件を確認すると値が変化します (i=3, j=2) -->ポスト インクリメントとポスト デクリメント
3. do while ループ内.. i=4 で j は同じ (j=2)
4. の条件ループが壊れている間に実行します。as (6%2 != 0 ==> returns false)
5. for ループの 3 番目の部分が実行され、i=6 と j=0 になります
。 6. ここで、条件セクションが実行されます。false を返し、i と j の値を (i=9 and j=-1) に変更します。

そして、値を i=9 および j=-1 として出力します

プレインクリメントとプレデクリメントだった場合、それらは無限ループに陥ります

于 2013-02-21T06:23:59.400 に答える
1

以下のように、コードを while() ループに変更できます: (i、j をそれぞれ m、n に置き換えました)

int m = 3, n = 3;
while( m++ == n-- ){    //Initially m and n are 3
    //m becomes 4 due to ++
    //n becomes 2 due to --

    m = m + n;  //m becomes 6 
    while( m % n != 0){ // 6 % 2 is 0
        m = m + n;  // Not called
    }

    m = m + 2; // m becomes 8
    n = n - 2; // n becomes 0

   //Goes back to the while(m++ == n--) to check condition again. 
   //However ( 8++ == 0--) is false, so while loop is not called again.
   //but, the values of m and n change to 9 and -1 respectively. 
}

さまざまな種類のループを混在させると、デバッグが少し複雑になる場合があります。

于 2013-02-21T06:24:48.803 に答える