web-dev-qa-db-ja.com

forループ、特にfor(;;)はどのように機能しますか?

古い会社コードを調べてみると、次のようなforループが見つかりました。

for (;;) {
    //Some stuff
}

Googleを試してみましたが、答えが見つかりませんでした。プログラミングクラスで眠りましたか、それとも異常なループですか?

61
Frank

Javaのforループの構造は次のとおりです-

_for (initialization statement; condition check; update)
    loop body;
_

ご覧のとおり、ここには4つのステートメントがあります-

  1. 初期化ステートメント:このステートメントは、ループが初めて入力されたときに一度だけ実行されます。これはオプションのステートメントです。つまり、このフィールドを空白のままにすることができます。通常、初期化の目的で使用されます。
  2. 条件付きチェック:このステートメントはおそらく最も重要なものです。特定の式がtrueと評価されるかどうかを確認するためにチェックします。そうであれば、ループの実行が継続されます。このフィールドを空のままにしておくと、trueと評価されます。
  3. 更新:このステートメントリストは左から右に実行され、通常は変数のインクリメント/デクリメントに使用されます。
  4. ループ本体:ループの本体。条件付きチェックの真理値に基づいて繰り返し実行されます。

基本的に、これは実行の続きです。最初に、ループに初めて入ると、初期化ステートメントが1回実行されます。次に、条件付きチェックが実行され、trueと評価されたかどうかが確認されます。そうである場合、ループ本体が実行され、そうでない場合、ループ実行は終了します。その後、Updateステートメントが実行されます。次に、条件付きチェックが再度実行され、trueと評価された場合、ループ本体が再度実行され、updateステートメントが実行され、次に条件付きチェックが実行されます。

for( ; ; )構文について説明します。初期化ステートメントがないため、何も実行されません。条件チェック文も空です。つまり、ループ本体が実行された後にtrueと評価されます。次に、更新ステートメントが空なので、何も実行されません。その後、条件付きチェックが再度実行され、再び真と評価され、このプロセス全体が再び繰り返されます。

つまり、これは基本的に、初期化ステートメントがなく、条件チェックが常にtrueと評価され、更新ステートメントがない無限ループです。これは-と同等です

_while(true)
{
    .....
}
_

これは、Javaのもう1つの一般的なループ構造です。

このような無限ループを使用する場合、ほとんどの場合、ループを無期限に実行させることはできないため、ブレーク条件に注意することが重要です。これらの種類のループから抜け出すには、breakステートメントを使用できます。構造は次のとおりです-

_if(some_condition_is_true)
    break;        // This will cause execution to break out of its nearest loop
_

または

_if(some_condition_is_false)
    break;
_
86
MD Sayem Ahmed

これは次と同じです:

while(true) {
  //Some Stuff
}

基本的に、無限ループの代替構文。

38
Marcelo

これらはすべて無限ループです

for(;;) {
   // endlessly
}

while(true) {
   // endlessly
}

do {
   // endlessly
} while(true);
9
Peter Lawrey

このループにはガードがなく、while(true)ループとして機能します。休憩まで無限ループします。

6
Aram Kocharyan

それは無限ループです。実際にはコンパイルされるか、実行時エラーがスローされるのは直感的ではないため、正確にコーディングすることはできません。 while(true) { /* code */ }として書き換えると、無限ループを示すためにはるかに読みやすくなります。

3
Travis Nelson

それは無限ループです。初期化、条件、および増分ステートメントはすべてオプションであるため、これらのいずれも使用しない場合、これは常にループします(ブレークがヒットするか、他の構造がそれと対話しない限り)。

Javaについては確信がありませんが、 この質問 は、.Netで空のforwhile (true)がまったく同じものにコンパイルされる方法を説明しています。 Javaも同様です。

2
Corey Ogburn