C言語基礎|if文で起こりやすいミス

if文で起こりやすいミス

if 文はとても基本的な構文ですが、初心者がつまずきやすい落とし穴がいくつもあります。
しかもやっかいなことに、「コンパイルエラーにならずに動いてしまう」ケースが多いのが特徴です。

ここでは、特によくあるミスを 原因・動作・正しい書き方 の視点で整理していきます。

制御式の後ろにセミコロンを付けてしまう

まず最も多いミスがこれです。

間違った例

if (n > 0);
    printf("その値は正です。\n");

一見すると問題なさそうですが、実行結果は常に同じになります。

実際の動き

このコードは、次のように解釈されます。

if (n > 0)
    ;
printf("その値は正です。\n");
意味
if (n > 0) ;条件が真なら「何もしない」
printf(...)if 文とは無関係なので必ず実行

結果

  • n が正 → 空文が実行される → printf 実行
  • n が負や 0 → if 文はスキップ → printf 実行

つまり 条件に関係なく必ず表示されます

正しい書き方

if (n > 0)
    printf("その値は正です。\n");

等価判定に = を使ってしまう

これも非常に有名で、しかも危険なミスです。

間違った例

if (a = 0)
    puts("aは0です。");

何が起きているか

処理内容
a = 0a に 0 を代入
評価結果0(偽)

そのため、

  • 条件は必ず偽
  • 文は一度も実行されない。
  • しかも a の値は 0 に書き換えられる。

という 二重の問題 が起きます。

正しい書き方

if (a == 0)
    puts("aは0です。");

3つの値を a == b == c で比較してしまう

複数の値を比較したいときにも、よくある誤りがあります。

間違った例

if (a == b == c)

なぜ間違いか

等価演算子 == は 2項演算子 です。

a == b == c

は、次の順で評価されます。

  1. a == b → 結果は 0 または 1
  2. その結果 == c を比較

つまり 意図した比較にはなりません

正しい書き方

if (a == b && b == c)
判定意味
a == ba と b が等しい
b == cb と c が等しい
&&両方成立したときのみ真

範囲判定を 3 <= a <= 5 と書いてしまう

数学的な感覚で書いてしまいがちなミスです。

間違った例

if (3 <= a <= 5)

なぜ動かないか

これも演算子の評価順が原因です。

(3 <= a) <= 5
評価結果
3 <= a0 または 1
0 または 1 <= 5常に真

結果として ほぼ常に条件が成立してしまいます。

正しい書き方

if (a >= 3 && a <= 5)

論理演算子の代わりに & や | を使ってしまう

見た目が似ているため、うっかりやってしまうミスです。

間違った例

if (a >= 3 & a <= 5)

問題点

演算子種類特徴
&ビット演算子常に両方評価
&&論理演算子短絡評価あり

& を使うと、

  • 論理判定として意図が分かりにくい。
  • 短絡評価が行われない。
  • 思わぬ副作用が起きる可能性あり

正しい書き方

if (a >= 3 && a <= 5)

よくあるミスまとめ表

ミス内容間違い例正しい例
セミコロンif (n > 0);if (n > 0)
代入と比較if (a = 0)if (a == 0)
多値比較a == b == ca == b && b == c
範囲判定3 <= a <= 5a >= 3 && a <= 5
演算子誤用& , |&& , ||

重要ポイント

  • if 文のミスは コンパイルエラーにならないことが多い
  • 演算子の意味と評価順を理解することが最大の防御策
  • 少しでも不安な条件式は、分解して書くのが安全

この章を押さえておくと、
「動いているけど間違っているコード」 を確実に減らせます。