導入:なぜ波括弧の省略が議論の的になるのか
C++のif文やfor文において、実行する処理が1行だけの場合、波括弧({})を省略して記述することが可能です。コードが短くスッキリ見えるという利点がある一方で、多くの開発現場では「波括弧の省略は避けるべき」というコーディング規約が採用されています。なぜ「書けるのに書かない方がいい」と言われるのか、その理由とリスクを解説します。
基礎知識:制御構造とブロックの仕組み
C++の制御構造(if, for, whileなど)において、波括弧で囲まれた範囲を「ブロック」と呼びます。波括弧を省略した場合、コンパイラは「制御構造の直後にある最初の文」だけをその制御対象として認識します。
例えば、if (condition) func(); と書いた場合、func(); だけが条件判定の影響を受けます。これがもし2行以上の処理を制御しようとして波括弧を忘れると、意図しないバグが発生する原因となります。
実装とリスク:なぜバグの温床になるのか
最も危険なのは、「後から処理を追加したとき」です。以下のようなコードを想像してください。
if (is_valid)
do_something();
この状態で、後からログ出力などの処理を追加したくなったとします。
if (is_valid)
do_something();
log(“実行完了”); // この行はif文の外側にあるため、常に実行されてしまう!
このように、インデントで視覚的にブロックを作っているつもりでも、コンパイラは2行目を制御対象外と見なします。これが原因で、条件に関係なく実行されるべきでないコードが動いてしまうという深刻なバグが発生します。
サンプルプログラム
以下のコードは、波括弧を省略した場合の危険性と、推奨される書き方を比較したものです。
include
void example_code() {
bool is_active = false;
// 危険な例:波括弧を省略
// 意図:is_activeがtrueの時だけ両方実行したい
if (is_active)
std::cout << "処理を開始します" << std::endl;
std::cout << "処理が終了しました" << std::endl;
// 実際には2行目はifの外側なので、is_activeに関係なく出力される
// 推奨される例:必ず波括弧で囲む
if (is_active) {
std::cout << "処理を開始します" << std::endl;
std::cout << "処理が終了しました" << std::endl;
}
}
int main() {
example_code();
return 0;
}
応用・注意点:現場でのベストプラクティス
現場でバグを未然に防ぐための鉄則は、「たとえ1行であっても必ず波括弧を記述する」ことです。
最近のIDEやエディタには自動フォーマット機能がありますが、それでもヒューマンエラーは防ぎきれません。波括弧を省略しないことで、以下のメリットが得られます。
1. 拡張性が高まる:後から行を追加してもバグが発生しない。
2. 可読性が向上する:制御範囲が明確になり、一目で構造が把握できる。
3. 視覚的な一貫性:他のメンバーが書いたコードとの統一感が生まれる。
「書けるかどうか」よりも「メンテナンスしやすいか」を優先することが、プロフェッショナルなC++エンジニアへの第一歩です。日々のコーディングから意識してみましょう。

コメント