C & C++ FAQ
目次
C
C++
比較でなく代入を行うif (a = b)がエラーとならないのはどうしてですか。
if
文の
( )
内の式は、スカラ型であれば何でもいいため、
if (a = b) 文
は、
b
を
a
に代入できる限り、文法的に正しいのです。
たとえば
a, b
ともに
int
型であったとしましょう。代入式を評価すると、代入後の左オペランドの型と値となりますから、それが非ゼロであれば文が実行され、ゼロであれば文は実行されません。
すなわち、この
if
文は、
a
に
b
を代入し、それが非ゼロであるかどうかの判断を行うという意図で書かれたものなのです。したがって、コンパイラがエラーメッセージを出力することはありません。ただし、親切なコンパイラであれば、タイプミスの可能性を考え、警告メッセージとして表示するかもしれません。
柴田望洋『
C言語プログラミングの落とし穴
』(p.218),ソフトバンク,1997に加筆修正。
戻る