C++ 演算子の優先順位
次の表は C++ 演算子の優先順位と結合性を一覧にしたものです。演算子は優先順位の高い順に上から下に並んでいます。a, b および c はオペランドです。
| 優先順位 | 演算子 | 説明 | 結合性 |
|---|---|---|---|
| 1 | a::b
|
スコープ解決 | 左から右 → |
| 2 | a++ a--
|
後置/接尾 インクリメントとデクリメント | |
type(a) type{a}
|
関数形式キャスト | ||
a()
|
関数呼び出し | ||
a[]
|
添字 | ||
a.b a->b
|
メンバアクセス | ||
| 3 | ++a --a
|
前置 インクリメントとデクリメント | 右から左 ← |
+a -a
|
単項 プラスとマイナス | ||
!a ~a
|
論理否定 と ビット否定 | ||
(type)a
|
C スタイルキャスト | ||
*a
|
間接参照 (デリファレンス) | ||
&a
|
アドレス取得 | ||
^^a
|
リフレクション演算子 (C++26 以降) | ||
sizeof
|
サイズ取得[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
|
コンマ | 左から右 → |
式を解析する際、テーブルのある行に記載された優先順位を持つ演算子は、それより下の行に記載された低い優先順位の演算子よりも、その引数に対して強く束縛されます (括弧で囲まれているかのように)。例えば、式 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言語では、三項条件演算子は代入演算子よりも優先順位が高い。したがって、式 e = a < d ? a ++ : a = d は、C++では e = ( ( a < d ) ? ( a ++ ) : ( a = d ) ) と解析されるが、C言語では文法上または意味上の制約によりコンパイルに失敗する。詳細は対応するC言語のページを参照のこと。
関連項目
| 共通演算子 | ||||||
|---|---|---|---|---|---|---|
| 代入 |
インクリメント
デクリメント |
算術 | 論理 | 比較 |
メンバー
アクセス |
その他 |
|
a
=
b
|
++
a
|
+
a
|
!
a
|
a
==
b
|
a
[
...
]
|
関数呼び出し
a ( ... ) |
|
カンマ
a, b |
||||||
|
条件演算子
a ? b : c |
||||||
| 特殊演算子 | ||||||
|
static_cast
関連する型間での変換を行う
|
||||||
|
C documentation
for
C operator precedence
|
|
C documentation
の
C operator precedence
|