Code Fix

初級

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パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)