【C言語】
while(1)を避け
for(;;)を使った
無限ループの書き方

■この記事の概要

この記事では、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(;;)を推奨します

参考:loops are done with for’s,not while’s.