if文の条件式で = と == を間違えて常に真になる
比較のつもりで==と書くべきところを=と書いてしまうと、比較ではなく代入になり、条件は代入した値の真偽で判定されます。エラーにはならず、意図しない分岐が起こります。
なぜエラーが出ないのか
出力: yes(okが0のはずなのに実行される)
(エラーなし)- Cは何も報告しません。コンパイルも実行も正常に完了するためです
出力: yes(okが0のはずなのに実行される)- 実際の挙動 — 期待した結果と食い違っている箇所
見つけ方- エラーが出ないので、出力を目で確かめるか、コードを目で追うしかありません。この種の誤りが最も発見が遅れます
このエラーが出る典型パターン
パターン1
1 #include <stdio.h> 2 3 int main(void) { 4 int ok = 0; 5 if (ok = 1) { ^ 6 printf("yes\n"); 7 } 8 return 0; 9 }
出力: yes(okが0のはずなのに実行される)期待: 何も表示されない
if (ok = 1)は比較ではなく代入です。okに1が代入され、その代入結果(1)が真として評価されるため、常にブロックが実行されます。
直し方: = を == にします。
広告
広告スロット(未設定)
パターン2
1 #include <stdio.h> 2 3 int main(void) { 4 int age = 15; 5 if (age = 18) { ^ 6 printf("adult\n"); 7 } else { 8 printf("minor\n"); 9 } 10 return 0; 11 }
出力: adult(15歳なのにadultと表示される)期待: minor
if (age = 18)はageに18を代入したうえで、その値(18、真)を条件として使ってしまいます。ageの実際の値である15は無視されます。
直し方: = を == にします。
パターン3
1 #include <stdio.h> 2 3 int main(void) { 4 int found = 0; 5 if (found = 1) { ^ 6 printf("found\n"); 7 } else { 8 printf("not found\n"); 9 } 10 return 0; 11 }
出力: found(foundは0のはず)期待: not found
=は代入、==は比較です。1文字の書き間違いですが、Cはこれを文法的に正しい式として受け入れてしまうため、エラーにはなりません。
直し方: = を == にします。
よくある誤解
Pythonでは代入を式の中で使えないため構文エラーになりますが、Cでは代入も1つの式として値を持つため、if文の条件式にそのまま書けてしまいます。0以外の値は真と評価されるため、多くの場合そのまま「常に真」になります。
まとめ
if文の条件式で = と == を間違えて常に真になるは初級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。