今日、仕事で見ていたソースコードにちょっとびっくりするものを見付けてしまいました。

    while (1) {
        if (...) {
            ...
            break;
        }
        ...
        ...
        break;
        /* whileループ終わり */
    }

一瞬、目を疑ってしまいました。何しろ私達のアプリケーションは時間にクリティカルな組込み制御で、そんな無限ループが許されるようなものではありません。でも良く見るとループの最後にbreak文があります…ということは実際にはループしないわけで…そうです。ただ単にある条件が成立したときに処理を飛ばすためだけにwhile節におけるbreakの効果を利用しているだけなのです。

私達の業界には満たさなければならないコーディング・ルールがあり、その中で「goto文はエラー処理など必要な場合を除き使用してはならない」というものがあります。恐らく上記のコードを書いた人はこのために無理してこのようなものにしてしまったのでしょうが、これでは本末転倒、まだgoto文の方がマシではないでしょうか。

一般にC言語では「gotoは悪」と思い込まれているのではないかと思いますが、なぜgotoがいけないかということを理解できている人は少ないのではないでしょうか。みだりにgotoを使ってしまうと、構造化プログラミングの妨げになってしまい、いくらCなどの構造化言語を使用していても見通しの悪いプログラムになってしまう、ということですね(違ったら恥ずかしい…)。本質を理解せずに表面だけをつくろった結果が上のようなコードになってしまうわけです。

プログラミングの世界だけではなく、物事の「本質」を見抜くということは非常に重要なことですね。なかなか難しいことではありますが、自分も恥ずかしい思いをすることのないよう、切磋琢磨したいと思います。