Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

繰り返し時の処理をしないfor文とは?無限ループ?いつ使うの?

解決したいこと

Javaの基本を再学習しています。
以下のfor文の使用場面をイメージできず、質問しました。

for (int i = 0; i<10; ){
  処理内容
}

質問1

このfor文はfor(;;){}と同様、無限ループを実装したいときに使用するのでしょうか…?
そうだとするとfor(;;){}で表記したほうが簡潔なので違うとは思いますが、このままだと無限ループになってしまうと考えます。

質問2

こちらは質問1に関連しての内容で少し外れてしまいますが。
Javaにおいてfor(;;){}while(true){}といった無限ループは、実際にどのような用途で使われているのでしょうか?
私が調べた限りでは、1時間毎に気象予測を表示させる、といった例がありました。
一定の間隔で同じ作業を繰り返させたいときに使うという認識で良いでしょうか?
この例は違う、だとか、全く毛色の違う他の例があれば、教えていただきたいです。

最後に

どちらか1つだけでも、教えていただけるとありがたいです!
よろしくお願いいたしますm(_ _)m

0

5Answer

質問2

Javaにおいてfor(;;){}while(true){}といった無限ループは、実際にどのような用途で使われているのでしょうか?
一定の間隔で同じ作業を繰り返させたいときに使うという認識で良いでしょうか?

私がぱっと思いついたのは、
「ある条件を満たすまで同じ処理を繰り返したいときに使う」
というケースです。

例えば、「データ送信してその結果を受信するまで待ちたい」場合、以下のような感じで作るかなと思います。

// ループ前にデータ送信
データ送信処理();

// データ受信するまで一定間隔でループしつつ待つ
while(true){

    データ受信処理();

    if( データ受信できた == true ){
        // データ受信できたらwhileを抜ける
        break;
    }

    一定時間wait();
}
2Like

Comments

  1. @tabetaaaaaaa

    Questioner

    なるほど、無限ループの中で条件分岐させて条件を満たせばbreakで抜ける使い方があるんですね・・・!
    これなら私でも使えそうです。
    わかりやすい説明ありがとうございますm(_ _)m

まず質問1ですが、私も具体的な使用場面がパッと出てきません。
「処理内容」の箇所にiの値を変化させる処理を記載しなければ無限ループに陥ることになりますが、
iの値を変化させる処理を記述すれば、(条件を満たすと)for文を抜けることができます。

ご質問のようなコードを書くとしたら、iの値が単純にインクリメントされるようなケースではなく、条件によって変わるようなちょっと複雑なケースと思います。

質問2の無限ループについては、例えばアニメーションのために一定時間毎に画面を描画するといったことにも使われます。

◯参考

サーバのプログラムでクライアントからの接続が来るまで無限に待ったり(ソケットプログラミング と呼ばれる世界の話)ということにも使われます。

◯参考

1Like

Comments

  1. @tabetaaaaaaa

    Questioner

    たくさん参考サイトを貼っていただきありがとうございます!
    質問1で記載しましたコードについて、このままでは無限ループになるという認識が正しいとわかっただけで安心しました。後は現場で出会ったときに考えようと思います。
    ありがとうございましたm(_ _)m

質問1
このfor文はfor(;;){}と同様、無限ループを実装したいときに使用するのでしょうか…?
そうだとするとfor(;;){}で表記したほうが簡潔なので違うとは思いますが、このままだと無限ループになってしまうと考えます。

for最後の変化式を省略する場合は
forの中に処理があれば省略する方法もありますが、
処理内容がどうなっているのか
質問に記述されていないので一概には回答できません。

意図的に無限ループを使用する場合は
@marumen さんの回答通りかと思われます。

以下、参考です。

1Like

Comments

  1. @tabetaaaaaaa

    Questioner

    あえて変化式をforの()の中ではなく処理内容のほうに書くという方法もあるんですね。
    条件によって変化式を変えるときなどでしょうか…ありがとうございます!m(_ _)m

質問2
こちらは質問1に関連しての内容で少し外れてしまいますが。
Javaにおいてfor(;;){}やwhile(true){}といった無限ループは、実際にどのような用途で使われているのでしょうか?

標準入力から値を受けとるタイプのプログラミングで、正しい入力が得られるまでループする(正しい入力の場合はループから抜ける)という処理を書くときに使ったことがあります。

ここのページにちょうど良いサンプルがありました。"y"か"yes"か"n"か"no"が入力されるまでループします。

1Like

Comments

  1. @tabetaaaaaaa

    Questioner

    なるほど…!こんなに身近なものにも使われているんですね。
    ありがとうございましたm(_ _)m

質問1
このfor文はfor(;;){}と同様、無限ループを実装したいときに使用するのでしょうか…?

処理の内容が書いていないので何とも言えない部分があるのですが、
iの内容が一定で増えていかないケースで使うのかと思いました。

for (int i = 0; i<10; ){
  // 処理

  if (何かの条件) {
     i++;
  } else {
     i--;
  }

  // 処理
}

とか。

ご想像の通り、処理の内容をきちんと書かないと無限ループになってしまいますので、できるなら避けたい書き方ではあります。

1Like

Comments

  1. @tabetaaaaaaa

    Questioner

    ありがとうございます!
    このままだと無限ループになるという自分の理解が正しくて安心しました。
    この構文が載っていた書籍には、for文の一例のような形で記載があり処理内容は書いていなかったのですが、iの増減を場合分けしたいときになったら使おうと思います!
    ありがとうございましたm(_ _)m

Your answer might help someone💌