■この記事の概要
この記事では、C言語で無限ループを書く際にwhile(1)
ではなくfor(;;)
を推奨する理由を解説しています。
while(1)
には誤解や静的解析ツールの警告がつきまとうため、より簡潔で意図が明確なfor(;;)
の方が可読性が高く実用的だと説明しています。
■while(1)とかwhile(true)とは何か?
while(式)は、
指定された「式」が真(0以外の値)である間、
ループを繰り返します。
つまり、while(真)と記述すると、
条件が常に真であるため無限ループします。
「真」とは、0以外のどんな値でも良いのですが、
最も単純な1やtrueが一般的に真として使われます。
そのため、
while(1)とwhile(true)は
無限ループを実現するためによく使われる構文です。
■無限ループwhile(1)には亜種が多い(非推奨)
#include <stdbool.h>
int main(void){
while(1) { //慣用表現
while(true) {
const int one = 1;
while(one) {
#define FORVER 1
while(FORVER){
#define INFINITE 1
while(INFINITE){
while(1==1){
;//亜種が多すぎ
}
}
}
}
}
}
}
while(1)から派生した色々な書き方があります。
for(;;)の派生は、せいぜいセミコロンの空白くらいです。
■while(1)に文句を言うツール対策(非推奨)
//while(1)に文句を言う静的解析ツール対策
void f2(void){
const int one = 1;
while(one) {;}
}
静的解析ツールの中にはヒステリックで
役に立たない警告を出す物があります。
例えば while(1)に対して
”条件式は常に成り立ちます”等と
大きなお世話の警告を出します。
これを回避するために、
定数1ではなくて変数one を使う技ですが
面倒くさいだけなのでfor(;;)を使用したほうが
楽でわかりやすいでしょう。
■1はマジックナンバーだと言う上司対策(非推奨)
//1はマジックナンバーだと言う上司対策
void f3(void){
#define FORVER 1
while(FORVER){;}
#define INFINITE 1
while(INFINITE){;}
}
while(1)は慣用表現なので世界中のC言語プログラマが
無限ループであると知っていますが
(知っていなければいけませんが)
可読性のためと称してわざわざローカル表現にしてしまうのは止めましょう。
ローカル表現にするくらいならばfor(;;)を使用したほうが
世界中のC言語プログラマが理解できるでしょう。
■bool型に強い思いwhile(1==1)(非推奨)
//bool型に強い思い入れ
void f4(void){
while(1==1) {;}
while(1!=0) {;}
while(0!=1) {;}
while(0==0) {;}
}
C言語のbool型がまだ無かった時代に
自作の bool型に強い思い入れがある人は
while(1)とか
while(TRUE)とか書くのを嫌い
上記のように記述する人がいました。
■無限ループじゃなくて無回転(非推奨)
//bool型に強い思い入れ
void f4(void){
while(1!=1) {;}
while(1==0) {;}
while(0==1) {;}
while(0!=0) {;}
}
このように間違える可能性があるので止めましょう。
■結局for(;;)を推奨します