1

以下のコード スニペットを見てみましょう。

int i = 0;
while ( i <= 10 )
{
    System.out.println(i);
    if ( i == 8 )
    {
        continue;
    }
    i++;
}

無限ループを回避するには、コードにどのような変更を加える必要がありますか?

4

4 に答える 4

11

最後ではなく最初にインクリメントを行います。

int i = -1;
while ( i <= 10 )
{
    i++;
    System.out.println(i);
    if ( i == 8 )
    {
        continue;
    }

    // Presumably there would be some code here, or this doesn't really make much sense
}

または、言語によっては、whileステートメント内で直接行うこともできます (i++またはを選択する際の演算子の優先順位に注意してください++i) 。

int i = 0
while ( i++ <= 10 )
{
    System.out.println(i);
    if ( i == 8 )
    {
        continue;
    }

    // Presumably there would be some code here, or this doesn't really make much sense
}

whileただし、この種の構造にループを使用することには疑問があります。ループでカウンターを使用する場合forは、通常、ループの方が適しています。

于 2013-01-17T19:35:26.903 に答える
4

クイックフィックス ソリューションの代わりに、コードを 1 分間見て、1 行ずつ実行してみましょう。

int i = 0;
while ( i <= 10 )
{
    System.out.println(i);
    if ( i == 8 )
    {
        continue;
    }
    i++;
}

i最初は 0 で、10 未満であるため、ループに入り、0 を出力して 1 にインクリメントします。その後i、2、3、4、.. 8 になります。

8に等しくなると、インクリメントする代わりに、ループの先頭に戻り、8を再度出力します.. i(8である)の値をチェックし、再び続行して8を出力します..そしてこれを続けます永遠まで。

したがって、テストする前に数値を増やすと、期待どおりに機能します。

コードを次のように変更します

int i = 0;
while ( i <= 10 )
{
    if ( i != 8 )
    {
        System.out.println(i);
    }
    i++;
}
于 2013-01-17T19:38:49.037 に答える
0

Eric Petroelje の答えが好きです。次のようなことをお勧めします。

if (++i >= 8) continue;

さらに、最近のコンパイラは、これを無限ループの可能性として警告するのに十分です。これを検出するコード分析ツールもあります。

于 2013-01-17T20:01:23.013 に答える
0

これは、ほとんどの場合に使用することをお勧めするコードではありませんが、目的には役立ちます。

int i = 0;
while ( i <= 10 )
{
  Console.WriteLine(i.ToString());
  if ( i == 8 )
  {
    // Do some work here, then bail on this iteration.
    goto Continue;
  }

Continue:  // Yes, C# does support labels, using sparingly!
  i++;
}
于 2013-01-17T20:05:59.537 に答える