C/C++で波括弧(中括弧)を省略するのはなぜ悪い習慣とされるのか?
波括弧の省略がもたらす問題
C++では、if-else文やループ(for、whileなど)の後の波括弧(中括弧)を省略してコードを書くことができます。しかし、波括弧を使わない場合、if-elseやループの直後にある1つの文だけがそのブロックに属すると解釈されます。以下の例で確認してみましょう。
if(condition) {
Line 1
Line 2
}
if(condition)
Line 1
Line 2
最初のケースでは、Line 1とLine 2の両方がifブロック内にあります。一方、2番目のケースでは、ifブロックに含まれるのはLine 1だけで、Line 2はブロックの外にあると見なされます。つまり、波括弧を省略できるのは、if-elseやループの配下に文が1つだけ存在する場合に限られるのです。
デバッグ時の落とし穴
デバッグの際、特定の行をコメントアウトして、その文がなくなったときに出力にどのような影響が出るかを確認することがよくあります。このとき、波括弧のないif-else文やループが思わぬトラブルを引き起こすことがあります。
if(condition) {
Line 1
}
Line 2
if(condition)
Line 1
Line 2
このどちらのケースでも、Line 1はifブロック内にありますが、Line 2はifブロックの外にあります。そのため、条件が真であれ偽であれ、Line 2は必ず実行されることになります。
ここで、デバッグのために以下のようにコードを変更したとしましょう。
if(condition) //Line 1 Line 2
Line 1をコメントアウトしたので、「これで意図どおりに動くはずだ」と考えがちですが、実際にはコンパイラはLine 2がifブロックに属していると解釈してしまいます。これはプログラマの意図とは明らかに異なる動作であり、条件の成否にかかわらずLine 2が実行されなくなるため、バグの原因となります。波括弧をきちんと記述していれば、このような問題は発生しません。
まとめ:常に波括弧を書くべき理由
このような理由から、たとえブロック内の文が1つだけの場合でも、波括弧を常に記述することが強く推奨されています。波括弧を省略すると、コードの可読性が低下するだけでなく、後から行を追加したりコメントアウトしたりした際に、予期しない動作やバグを生む温床となります。実際、多くのコーディング規約(Google C++スタイルガイドなど)でも、波括弧を必ず付けることがルールとして定められています。小さな習慣ですが、長期的なコードの保守性と安全性を大きく左右する重要なポイントです。
-
C/C++で配列のインデックスが0から始まる理由を解説
配列インデックスがゼロから始まる仕組みC言語やC++において、配列の要素へのアクセスは arr[i] = *(arr + i) という形で解釈されます。ここで arr は配列の先頭要素(インデックス0の要素)のアドレスを表します。つまり、*(arr + i) とは「配列の先頭要素から i だけ離れた位置にある要素」を意味します。ループの最初では i の値が 0 であるため、*(arr + 0) は配列の最初の要素を指すことになります。このポインタ演算の仕組みこそが、配列のインデックスが 1 ではなく 0 から始まる理由です。サンプルプログラム以下のC++プログラムは、この動作を実際に確認できる
-
C++で点集合の線対称(ラインリフレクション)を判定するアルゴリズム
問題概要2次元平面上にn個の点が与えられます。このとき、y軸に平行な直線で全ての点を鏡映(反射)した結果が、元の点集合と完全に一致するような直線が存在するかどうかを判定します。言い換えれば、ある直線を対称軸として全ての点を反転させたとき、反転後の点の集合が元の集合と同一になるかを確認する問題です。例えば、入力が points = [[1,1],[-1,1]] の場合を考えてみましょう。この場合、x = 0 の直線(y軸)を対称軸とすると、点 (1,1) は (-1,1) へ、(-1,1) は (1,1) へと移ります。点集合全体としては変化がないため、出力は true となります。解法のポイン