関係演算子
C言語において、if (x == y) は大雑把に言えば「x と y が等しければ後続の文を実行せよ」を意味する。しかし、if (x = y) とミスタイプすると「x に y の値を割り当て、もし x の新しい値が0でなければ、後続の文を実行せよ」という意味になってしまう。たとえば、下記の例で if (x = y) と書いてしまうと、y が x に代入され両方とも2になり、更に x の値2は0ではないので、常に if 文のブロックが実行される。したがって、以下のコードは "x is 2 and y is 2" を出力する。
他の言語やコンパイラの中には、このようなミスを事前に防ぐように工夫されているものもある。
同じ演算子を持つJavaやC#も同様の問題を孕んでいるが、これらの言語ではこの種の誤りは、ほとんどの場合コンパイルエラーとして検出できる。if文やwhile文などの条件式はブーリアン型に制約され、また他の型(例えば整数型)からブーリアン型に暗黙的に変換されることもほとんどないからである。
GCC/ClangやMicrosoft Visual C++などのいくつかのコンパイラでは、if や while の条件式中に代入演算子を含んでいるコードをコンパイルするときに警告を出す(-Wparentheses、C4706)。
PascalやAdaなどでは、Cと違い代入演算子は:=、等値比較演算子は=であり、また式の途中に代入演算子は登場できないので、この種の誤りは排除できる。
Pythonにおいては、C同様に代入演算子は=、等値比較演算子は==であるものの、代入は式ではなく文であり、この種の誤りは排除できる。