Namespaces
Variants

C++ 演算子の優先順位

ja.cppreference.net より
 
 
C++ 言語
一般トピック
フロー制御
条件実行文
if
繰り返し文 (ループ)
for
範囲-for (C++11)
ジャンプ文
関数
関数宣言
ラムダ関数式
inline 指定子
動的例外仕様 (C++17 まで*)
noexcept 指定子 (C++11)
例外
名前空間
型
指定子
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
記憶域期間指定子
初期化
式
代替表現
リテラル
論理値 - 整数 - 浮動小数点
文字 - 文字列 - nullptr (C++11)
ユーザ定義 (C++11)
ユーティリティ
属性 (C++11)
型
typedef 宣言
型エイリアス宣言 (C++11)
キャスト
メモリ確保
クラス
クラス固有の関数プロパティ
explicit (C++11)
static

特殊メンバ関数
テンプレート
その他
 
 

次の表は 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 コンマ 左から右 →
  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++関連用語はそのまま保持 - 元のフォーマットを完全に維持