C++の演算子の優先順位
以下の表は C++ の演算子の優先順位と結合性の一覧です。 演算子は優先順位の高いものから低いものへ、上から下に並べられています。
優先順位 | 演算子 | 説明 | 結合性 |
---|---|---|---|
1 | ::
|
スコープ解決 | 左結合 |
2 | a++ a--
|
後置インクリメント、デクリメント | |
type() type{}
|
関数スタイルのキャスト | ||
a()
|
関数呼び出し | ||
a[]
|
添字 | ||
. ->
|
メンバアクセス | ||
3 | ++a --a
|
前置インクリメント、デクリメント | 右結合 |
+a -a
|
正号、負号 | ||
! ~
|
論理否定、ビット単位の論理否定 | ||
(type)
|
C スタイルのキャスト | ||
*a
|
間接参照 (逆参照) | ||
&a
|
アドレス取得 | ||
sizeof
|
サイズ取得[注 1] | ||
co_await
|
await 式 (C++20) | ||
new new[]
|
動的メモリ確保 | ||
delete delete[]
|
動的メモリ解放 | ||
4 | .* ->*
|
メンバポインタ | 左結合 |
5 | a*b a/b a%b
|
乗算、除算、剰余 | |
6 | a+b a-b
|
加算、減算 | |
7 | << >>
|
ビット単位の左シフト、右シフト | |
8 | <=>
|
三方比較演算子 (C++20以上) | |
9 | < <=
|
関係演算子 < ≤ | |
> >=
|
関係演算子 > ≥ | ||
10 | == !=
|
関係演算子 = ≠ | |
11 | &
|
ビット単位の論理積 | |
12 | ^
|
ビット単位の排他的論理和 | |
13 | |
|
ビット単位の論理和 | |
14 | &&
|
論理積 | |
15 | ||
|
論理和 | |
16 | a?b:c
|
三項条件[注 2] | 右結合 |
throw
|
throw 演算子 | ||
co_yield
|
yield 式 (C++20) | ||
=
|
直接代入 (C++ のクラスに対してデフォルトで提供されます) | ||
+= -=
|
加算、減算による複合代入 | ||
*= /= %=
|
乗算、除算、剰余による複合代入 | ||
<<= >>=
|
ビット単位の左シフト、右シフトによる複合代入 | ||
&= ^= |=
|
ビット単位の論理積、排他的論理和、論理和による複合代入 | ||
17 | ,
|
コンマ | 左結合 |
- ↑
sizeof
の被演算子に C スタイルの型キャストは使用できません。 式sizeof (int) * p
はsizeof((int)*p)
ではなく(sizeof(int)) * p
と曖昧性なく解釈されます。 - ↑ 条件演算子の中央の式 (
?
と:
の間) は括弧で囲まれているかのように解析され、?:
との相対的な優先順位は無視されます。
式を解析するとき、ある優先順位を持つ行に掲載されている演算子は、それより低い優先順位を持つ行に掲載されているいかなる演算子よりも、その引数をよりタイトに (括弧で囲まれたかのように) 束縛します。 例えば、式 std::cout << a & b は std::cout << (a & b) ではなく (std::cout << a) & b と解析され、式 *p++ は (*p)++ ではなく *(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[b] |
a(...) |
特殊な演算子 | ||||||
static_cast は型を別の関連する型に変換します。 |
Cの演算子の優先順位 の C言語リファレンス
|