C++演算子の優先順位
以下の表は、C++演算子の優先順位と結合規則を示したものです。演算子は優先順位の高いものから順に、上から下へ記載されています。a、b、cはオペランドです。
| 優先順位 | Operator | 説明 | 結合規則 |
|---|---|---|---|
| 1 | a::b | スコープ解決 | 左から右へ → |
| 2 | a++ a-- | 後置インクリメントとデクリメント | |
type(a) type{a} |
関数形式のキャスト | ||
| a() | 関数呼び出し | ||
| a[] | 添字 | ||
| a.b a->b | メンバアクセス | ||
| 3 | ++a --a | 前置インクリメントとデクリメント | 右から左へ ← |
| +a -a | 単項プラスとマイナス | ||
| !a ~a | 論理否定とビット単位NOT | ||
(type)a
|
C形式のキャスト | ||
| *a | 間接参照(デリファレンス) | ||
| &a | アドレス取得 | ||
sizeof
|
Size-of[注 1] | ||
| co_await | await式 (C++20) | ||
new – new[] |
動的メモリ確保 | ||
delete – delete[] |
動的メモリ解放 | ||
| 4 | a.*b a->*b | メンバへのポインタ | 左から右へ → |
| 5 | a * b a / b a % b | 乗算、除算、剰余 | |
| 6 | a + b a - b | 加算と減算 | |
| 7 | a << b a >> b | ビット単位左シフトと右シフト | |
| 8 | a <=> b | 三方比較演算子 (C++20以降) | |
| 9 | a < b a <= b a > b a >= b | それぞれ関係演算子の<、<=、>、>= | |
| 10 | a == b a != b | それぞれ等価演算子の=と!= | |
| 11 | a & b | ビット単位AND | |
| 12 | a ^ b | ビット単位XOR(排他的論理和) | |
| 13 | a | b | ビット単位OR(論理和) | |
| 14 | a && b | 論理AND | |
| 15 | a || b | 論理OR | |
| 16 | a ? b : c | 三項条件演算子[注 2] | 右から左へ ← |
throw
|
throw演算子 | ||
| co_yield | yield式 (C++20) | ||
| a = b | 直接代入(C++クラスではデフォルトで提供される) | ||
| a += b a -= b | 和と差による複合代入 | ||
| a *= b a /= b a %= b | 積、商、剰余による複合代入 | ||
| a <<= b a >>= b | ビット単位左シフトと右シフトによる複合代入 | ||
| a &= b a ^= b a |= b | ビット単位AND、XOR、ORによる複合代入 | ||
| 17 | a, b | コンマ | 左から右へ → |
- ↑ sizeofのオペランドはC形式の型キャストにはできません。式sizeof (int) * pは、sizeof((int)*p)ではなく、(sizeof(int)) * pとして一意に解釈されます。
- ↑ 条件演算子の中間の式(
?と:の間)は、括弧で囲まれているかのように解析されます。つまり、?:に対する相対的な優先順位は無視されます。
式を解析する際、上の表のある行に記載されている演算子は、それより下の行に記載されている優先順位の低いどの演算子よりも、その引数と強く結合されます(括弧で囲まれているかのように)。例えば、式std::cout << a & bと*p++は、(std::cout << a) & bと*(p++)として解析され、std::cout << (a & b)や(*p)++とは解析されません。
同じ優先順位を持つ演算子は、その結合規則の方向に引数と結合されます。例えば、式a = b = cは、代入演算子が右から左への結合規則を持つため、a = (b = c)として解析され、(a = b) = cとは解析されません。しかし、a + b - cは、加算と減算が左から右への結合規則を持つため、(a + b) - cとして解析され、a + (b - c)とは解析されません。
単項演算子にとって結合規則の指定は冗長であり、完全性のためにのみ示されています。単項前置演算子は常に右から左へ結合し(delete ++*pはdelete(++(*p)))、単項後置演算子は常に左から右へ結合します(a[1][2]++は((a[1])[2])++)。メンバアクセス演算子は単項後置演算子と同じグループに分類されますが、結合規則が意味を持つことに注意してください。a.b++は(a.b)++と解析され、a.(b++)とは解析されません。
演算子の優先順位は演算子のオーバーロードの影響を受けません。例えば、std::cout << a ? b : c;は、算術左シフト演算子の優先順位が条件演算子より高いため、(std::cout << a) ? b : c;として解析されます。
[編集] 注釈
優先順位と結合規則はコンパイル時の概念であり、実行時の概念である評価順序とは独立しています。
標準規格自体は優先順位のレベルを規定していません。それらは文法から導出されます。
const_cast、static_cast、dynamic_cast、reinterpret_cast、typeid、sizeof...、noexcept、alignofは、決して曖昧にならないため、ここには含まれていません。
一部の演算子には代替の綴りがあります(例:&&に対するand、||に対するor、!に対するnotなど)。
C言語では、三項条件演算子は代入演算子よりも高い優先順位を持ちます。したがって、C++ではe = ((a < d) ? (a++) : (a = d))と解析される式e = a < d ? a++ : a = dは、C言語の文法的または意味的な制約により、Cではコンパイルに失敗します。詳細は対応するCのページを参照してください。
[編集] 関連項目
| 共通の演算子 | ||||||
|---|---|---|---|---|---|---|
| 代入 | インクリメント デクリメント |
算術 | 論理 | 比較 | メンバ アクセス |
その他 |
|
a = b |
++a |
+a |
!a |
a == b |
a[...] |
関数呼び出し a(...) |
| コンマ a, b | ||||||
| conditional a ? b : c | ||||||
| 特殊な演算子 | ||||||
|
static_castは、ある型を関連する別の型に変換する | ||||||
| C言語の演算子の優先順位に関するCのドキュメント
|