【C++学習|豆知識】C++における波括弧の省略:なぜ「1行ならOK」が危険なのか?

導入:なぜ波括弧の省略が議論の的になるのか

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++エンジニアへの第一歩です。日々のコーディングから意識してみましょう。

コメント

タイトルとURLをコピーしました