C言語では、if構文内の単一ステートメントに対して中括弧を省略することが許可されていました。これによりコードはコンパクトになりますが、特に拡張や修正を行う際に多くの見えないエラーを引き起こす原因となりました。歴史的な理由は、スペースの節約と最小限のケースのための簡潔な文法です。
問題が発生するのは、開発者が中括弧なしでifが次の最初の式のみを制御することを忘れるときです。そのため、次のすべては無条件に実行され、視覚的にはそれが明らかでない場合があります。このスタイルは、コードを読む際に発見が難しい隠れたバグにつながり、忘れられたインデントや新しい行の追加によってエラーを引き起こすことがあります。
解決策は、たとえステートメントが1つだけでも常に中括弧を使用することです。これによりコードの可読性と安全性が向上します。
コードの例:
// 悪い例: if (x > 0) do_something(); do_other(); // 常に実行される // 良い例: if (x > 0) { do_something(); do_other(); }
重要な特徴:
インデント(タブ/スペース)はifのスコープに影響しますか?
いいえ、C言語ではスコープは中括弧によってのみ決まります。
以下のようなコードの挙動はどうなりますか?
if (a > 0) fun1(); fun2();
fun1()はa > 0のときのみ呼び出されます。fun2()は条件に関係なく常に呼び出されます。
新しい行を追加する際に中括弧を忘れるとどんな影響がありますか?
このコードは動作を変更し、視覚的には検出が難しいエラーを引き起こす可能性があります。インデントはコンパイルエラーを防ぐものではありません。
開発者が中括弧を追加するのを忘れて一行のifに二つ目のステートメントを追加しました。
if (user) initialize(); log_access();
良い点:
悪い点:
開発者は常に一つのステートメントでも中括弧を使います:
if (user) { initialize(); log_access(); }
良い点:
悪い点: