C++ Operator Precedence
以下の表は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 | 論理NOT および ビット単位NOT | ||
(
type
)
a
|
Cスタイルキャスト | ||
| * a | 間接参照 (dereference) | ||
| & a | アドレス取得 | ||
sizeof
|
サイズ演算子 [注 1] | ||
| co_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言語では、三項条件演算子は代入演算子よりも優先順位が高い。したがって、式 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
|