Namespaces
Variants

C++ Operator Precedence

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Operators
Operator precedence
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

以下の表はC++演算子の優先順位と結合性を示しています。演算子は上から下へ、優先順位の降順にリストされています。 a b および c はオペランドです。

HTMLタグ、属性、 タグ内のC++コード(a++、a--)はそのまま保持し、説明文のみを日本語に翻訳しました。C++用語(increment/decrement)は「インクリメント/デクリメント」として技術用語を維持しています。 HTMLタグ、属性、および` `内のC++コード(`a.b`、`a->b`)は翻訳せず、そのまま保持しました。C++固有の用語も翻訳していません。リンクテキスト「Member access」のみを「メンバーアクセス」に翻訳し、プロフェッショナルな表現を心がけました。 翻訳のポイント: - HTMLタグ、属性、数値はそのまま保持 - ` `タグ内のC++コード(`++a`、`--a`)は翻訳せず - C++専門用語(increment/decrement)は対応する日本語技術用語で翻訳 - 表記の統一:前置インクリメント/デクリメント - 矢印の方向「右から左」を正確に翻訳 HTMLタグ、属性、および` `タグ内のテキストは翻訳せず、元のフォーマットを保持しました。C++固有の用語は翻訳せず、プロフェッショナルで正確な翻訳を心がけました。 HTMLタグ、属性、 タグ内のC++コード(&a)は翻訳せず、そのまま保持しました。C++固有の用語も翻訳していません。「Address-of」のみを「アドレス取得」に翻訳しました。 HTMLタグ、属性、および` `内のC++コード(`a & b`)は翻訳せず、そのまま保持しました。演算子名「Bitwise AND」のみを「ビット単位 AND」に翻訳しました。 HTMLタグ、属性、および` `内のC++コード(`a && b`)は翻訳せず、そのまま保持しました。表の見出し「Logical AND」のみを「論理AND」に翻訳しました。
優先順位 演算子 説明 結合性
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 コンマ演算子 左から右へ →
  1. sizeof のオペランドはCスタイルの型キャストにできません:式 sizeof ( int ) * p は明確に ( sizeof ( int ) ) * p と解釈され、 sizeof ( ( int ) * p ) とは解釈されません。
  2. 条件演算子の中間の式( ? : の間)は、括弧で囲まれているかのように解析されます: ?: に対する優先順位は無視されます。

式を解析する際、上記の表のある行に優先順位が記載されている演算子は、より低い優先順位を持つ下の行に記載されている演算子よりも(括弧で囲まれたかのように)その引数に強く結びつけられます。例えば、式 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言語のページを参照のこと。

関連項目

HTMLタグ、属性、および` `内のC++コードは翻訳せず、元のフォーマットを保持しました。「comma」のみを「カンマ」に翻訳しています。
共通演算子
代入 インクリメント
デクリメント
算術 論理 比較 メンバー
アクセス
その他

a = b
a + = b
a - = b
a * = b
a / = b
a % = b
a & = b
a | = b
a ^ = b
a <<= b
a >>= b

++ a
-- a
a ++
a --

+ a
- a
a + b
a - b
a * b
a / b
a % b
~a
a & b
a | b
a ^ b
a << b
a >> b

! a
a && b
a || b

a == b
a ! = b
a < b
a > b
a <= b
a >= b
a <=> b

a [ ... ]
* a
& a
a - > b
a. b
a - > * b
a. * b

関数呼び出し

a ( ... )
カンマ

a, b
条件演算子

a ? b : c
特殊演算子

static_cast 関連する型間での変換を行う
dynamic_cast 継承階層内での変換を行う
const_cast cv 修飾子の追加または削除を行う
reinterpret_cast 無関係な型間での変換を行う
C-style cast static_cast , const_cast , および reinterpret_cast の組み合わせによる型変換
new 動的ストレージ期間を持つオブジェクトを作成する
delete new式で作成されたオブジェクトを破棄し、取得したメモリ領域を解放する
sizeof 型のサイズを問い合わせる
sizeof... pack のサイズを問い合わせる (C++11以降)
typeid 型の型情報を問い合わせる
noexcept 式が例外をスローできるかどうかをチェックする (C++11以降)
alignof 型のアライメント要件を問い合わせる (C++11以降)

C documentation for C operator precedence
日本語訳:
C documentation C operator precedence
変更点: - 「for」を「の」に翻訳 - HTMLタグ、属性、C++関連用語はそのまま保持 - 元のフォーマットを完全に維持