演算子 (CとC++)
読み:えんざんし
外語:operator

 CC++の演算式で使われる記号のこと。
目次

概要
 C(とその先代のB)は、従来のプログラミング言語とは異なる様々な演算子を定義した。
 C++にもその仕様が継承されているのはもちろん、Cの影響を受けた様々なプログラミング言語スクリプト言語でも使われている。

特徴
 Cの後継のC++では、様々な新機能が導入されている。基本的な仕様は継承されているが、C++では更に多重定義(オーバーロード)が可能になり、ほとんどの演算子の動作を再定義できる。
 C/C++には多数の演算子があるが、演算子には優先順位と結合性が定義されている。なお、C++で演算子を再定義しても、優先順位は変化しない。
 また、C++にはnew/deleteといったメモリー確保・解放用の演算子があるが、new・delete演算子もオーバーロードできる。

一覧
 種類ごとの演算子の分類(順不同)。
算術演算子
機能書式多重定義
単項プラス+a
加算a + b
前置インクリメント++a
後置インクリメントa++
加算代入a += b
単項マイナス-a
減算a - b
前置デクリメント--a
後置デクリメントa--
減算代入a -= b
乗算a * b
乗算代入a *= b
除算a / b
除算代入a /= b
剰余a % b
剰余代入a %= b
比較演算子
機能書式多重定義
等価a == b
不等価a != b
小なりa < b
小なりイコールa <= b
大なりa > b
大なりイコールa >= b
論理演算子
機能書式多重定義
論理否定!a
論理積a && b
論理和a || b
ビット演算子
機能書式多重定義
ビット否定~a
ビット積a & b
ビット積代入a &= b
ビット排他的論理和a ^ b
ビット排他的論理和代入a ^= b
ビット和a | b
ビット和代入a |= b
左シフト<<
左シフト代入<<=
右シフト>>
右シフト代入>>=
型キャスト演算子
機能書式多重定義
const型キャストconst_cast<type>(a)×
動的型キャストdynamic_cast<type>(a)×
静的型キャストstatic_cast<type>(a)×
強制型キャストreinterpret_cast<type>(a)×
型キャスト(type)a
型キャスト(関数スタイル)type(a)
その他
機能書式多重定義
スコープの解決::×
代入a = b
関数呼び出しa()
配列添字参照a[b]
直接メンバーアクセスa.b×
直接メンバーポインターa.*b×
間接メンバーアクセスa->b
間接メンバーポインターa->*b
アドレス取得&a
間接参照、参照外し*a
条件演算子a ? b : c×
順次演算子a , b
実行時型情報typeid(a)typeid(type)×
サイズの取得sizeof(a)sizeof(type)×
動的な領域確保new type
動的な配列領域確保new type[n]
動的な領域開放delete a
動的な配列領域開放new delete[] a
例外送出throw a×

優先順位
 ()でくくられていない式において、優先的に結びつく順序を、優先順位という。
 順位の番号は、この表における整理のためのもので、規格で定められているわけではない。
順位演算子機能結合方向多重定義
1::スコープの解決×
2()関数呼び出し左から右
[]配列添字参照
.直接メンバーアクセ ス×
->間接メンバーアクセス
++後置インクリメント
--後置デクリメント
typeid実行時型情報×
const_cast型キャスト×
dynamic_cast型キャスト×
static_cast型キャスト×
reinterpret_cast型キャスト×
タイプ()型キャスト
3++前置インクリメント右から左
--前置デクリメント
+単項プラス
-単項マイナス
~ビット否定
!論理否定
&アドレス取得
*間接参照、参照外し
(タイプ)型キャスト
sizeofサイズの取得×
new動的な領域確保
new[]動的な配列領域確保
delete動的な領域開放
delete[]動的な配列領域開放
4.*メンバーへのポインター左から右×
->*メンバーへのポインター
5*乗算
/除算
%剰余
6+加算
-減算
7<<左シフト
>>右シフト
8<小なり
<=小なりイコール
9>大なり
>=大なりイコール
10==イコール(等価)
!=ノットイコール(不等価)
11&ビット積(AND)
12^ビット排他的論理和(XOR)
13|ビット和(OR)
14&&論理積
15||論理和
16? :条件演算子右から左×
17=代入
*=乗算代入
/=除算代入
%=剰余代入
+=加算代入
-=減算代入
<<=左シフト代入
>>=右シフト代入
&=ビット積代入
^=ビット排他的論理和代入
|=ビット和代入
throw例外送出×
18,順次演算子左から右

注意点・問題点
 C/C++の優先順位は必ずしも適正とは言い難く、この優先順位にはいくつか理不尽な問題点が存在する。
 代表例として、ビット演算(ビット積、ビット排他的論理和、ビット和)の優先順位が不当に低いことが挙げられる。イコール(等価)演算子よりも低いため、次のような演算式は、期待通りには動作しない。
 if (a & b == c) { ... }
 a&bの結果がcと等価なら、という条件を想定しているが、残念ながら、この式「a & b == c」は、「a & (b == c)」と解釈されるため、想定通りには動作しない。()をきちんと書かねばならないのである。

再検索