
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 = 0 | a に 0 を代入 |
| 評価結果 | 0(偽) |
そのため、
- 条件は必ず偽
- 文は一度も実行されない。
- しかも a の値は 0 に書き換えられる。
という 二重の問題 が起きます。
正しい書き方
if (a == 0)
puts("aは0です。");3つの値を a == b == c で比較してしまう
複数の値を比較したいときにも、よくある誤りがあります。
間違った例
if (a == b == c)なぜ間違いか
等価演算子 == は 2項演算子 です。
a == b == cは、次の順で評価されます。
- a == b → 結果は 0 または 1
- その結果 == c を比較
つまり 意図した比較にはなりません。
正しい書き方
if (a == b && b == c)| 判定 | 意味 |
|---|---|
| a == b | a と b が等しい |
| b == c | b と c が等しい |
| && | 両方成立したときのみ真 |
範囲判定を 3 <= a <= 5 と書いてしまう
数学的な感覚で書いてしまいがちなミスです。
間違った例
if (3 <= a <= 5)なぜ動かないか
これも演算子の評価順が原因です。
(3 <= a) <= 5| 評価 | 結果 |
|---|---|
| 3 <= a | 0 または 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 == c | a == b && b == c |
| 範囲判定 | 3 <= a <= 5 | a >= 3 && a <= 5 |
| 演算子誤用 | & , | | && , || |
重要ポイント
- if 文のミスは コンパイルエラーにならないことが多い。
- 演算子の意味と評価順を理解することが最大の防御策
- 少しでも不安な条件式は、分解して書くのが安全
この章を押さえておくと、
「動いているけど間違っているコード」 を確実に減らせます。
