CとC++の演算子
C++では、一部の演算子に対して、全く同じに機能する代替表現を予約している。代替表現はキーワードと同様に予約されている字句として扱われる。
これらの代替表現は、記号的に等価として扱われ、どこでも記号を代替表現に置き換えても問題ない。置き換える先は、演算子としてではなく記号として扱われる。つまりbitandはビット積演算子だけでなくアドレス取得演算子の代わりに用いても機能するということである。
ANSI Cでは、これらを<iso646.h>でCプリプロセッサのマクロを用いて定義している。これとの互換性のために、C++ではヘッダ<iso646.h>と<ciso646>を用意しているが、中身は空である。
C++では、すべての比較演算子は真偽値を返す。
==はbool型の値を返すため、==演算子はif文などの中に限定されず、どこでも使用可能である。なお、a = b == c;は次のように書くのと同様の効果をもたらす。
上の2 * ((y[i])++)という例では、優先順位と直接には関係なく、単に演算のためにその値が必要であるという(データフロー的な)理由により、後置++演算子がy[i]より後に作用する、ということしか明確ではない。
CやC++において、演算子の結合は、優先順位ではなく(各々の標準規格での)文法によって定められている。このため、僅かな差異が生じる場合がある。たとえば、Cの条件演算子は以下のように定義されている。
一方、C++では次のように定義されている。
そのため、
という式は、Cだと
と解釈されて条件演算子の結果が左辺値でないことによるエラーとなるが、C++だと
と解釈され、正しい式となる。
論理演算子の優先順位は問題があると指摘されている。概念的には&と|は算術演算子の+と-のような存在である。しかし、a + b == 7は(a + b) == 7と解釈されるが、a & b == 7という式はa & (b == 7)と解析されてしまう。ほかにも期待通りに解釈させるための括弧を必要とする場合がある。