Cコードで永久ループを作りたい時、do { ... } while(1) とか while(1) { ... } といった書き方を目にすることがある。たまたま今日、そういうコードを見た。それらは文法として間違ってないし、意図通りに動くか否かどっちなんだ、と訊かれれば、間違いなく「動く」のだが、人間に厳しいコンパイラなら警告が出る。

さて、C言語の文法書(K&R)をよくよく読めば、一応「正統な永久ループの書き方」があることが判る。15年ほど前、あるプログラマが書いたコードを見ていて、そのことに気付いた。具体的には次の様なコードだ。


--
#define     ever    (;;)

void    main( void ) {
    for ever {
        process();
    }
}
--

この書き方は処理系依存ではなく、あらゆる(ANSI)Cコンパイラ(プリプロセッサ含む)が正しく記述されたCソースとして扱ってくれる。文法として正しい以上、そうでなければCコンパイラと言えなくなってしまうからだ。ひとひねり入っているが、このようなコーティングには、何か心に感じるものがある。

Cは高水準言語とは少し言い難い。しかしながら、こういうコードに出会うと、アルゴリズム表現の潜在的可能性を垣間見た気がする。結局、書き手次第で「言語の水準(レベル)が決まる」ということだ。