ループ処理で用いるwhile文。
while文はどのプログラミング言語でもループ条件を指定します。
while(flag == true){...
while文は条件式が真であるかぎりループし続けるワケですが、この条件式に数値の1を指定してwhile(1)
のようにする書き方をするときがあります。
while(1){...
今回はこのwhile(1)
とはどういう意味を持つ書き方なのか、簡単に解説していきます。
while(1)の意味
while(1)
は一言で言うと無限ループです。while文が使えるプログラミング言語の多くは、0が偽、0以外は真として扱われるようになっており、while(1)
というのは常に真、つまりwhile文ループをずっと処理し続けるという意味を持つのです。
while(1){
//無限ループ
}
この場合、条件式に変数を指定していないので、必ず無限ループになります。そのため、一度while(1)
のループに到達したらwhile文の条件式が偽になってループを抜けることは絶対にありません。
そのため必ずbreak文を使ってループを抜ける処理を用意する必要があります。
なぜwhile(1)を使うのか?
どのようなプログラムであれ、いつかはループを抜ける必要が出てくる(プログラム終了時など)必要があります。
そのため、確実に無限ループになってしまうwhile(1)
は使ったらいけない書き方なのでは?と思うかもしれません。
ですが、以下のようなケースにおいて、while(1)
を使用するときがあります。
- ループ内の分岐処理のうち1つを実行したらループを抜ける
- ループ内でbreak文を使っており、breakしない時の処理を別で記述している
こうったケースでは意図的にwhile(1)
と書くことがあります。
例えば「ループ内の分岐処理のうち1つを実行したらループを抜ける」の場合で、乱数が特定の値だったときに値に沿った処理を行ってループを抜けるという場合はwhile(1)
が使えます。
#include <stdio.h>
#include <stdlib.h>
int main() {
int num = 0;
while (1) {
num = rand() % 100;
if (num == 50) {
//処理
break;
}
else if (num == 30) {
//処理
break;
}
}
return 0;
}
この場合、while文の条件式判定のタイミングでループを抜ける必要がないので、while(1)
にしたほうが無駄な条件分岐処理がなくなって処理効率が上がります。
for(;;)も無限ループ
余談ですが、for(;;)
も無限ループとして扱えます。
for(;;)
プログラミング言語によってfor文の構文が異なるので、for(;;)
が使える言語は限られます。
C言語やJavaなどfor文の初期化;条件式;ループ処理に形で区切るプログラミング言語では有効です
while(1)は無限ループと覚えておこう
while(1)
を狙って実用するシーンはあまり多くないですが、知っているとプログラミングの引き出しが増えるので、効率の良いプログラム書きやすくなります。
while(1)
は無駄のない無限ループといえるので、意図的な無限ループが有効な場面で活用するといいでしょう。