名前空間
変種
操作

C++演算子の優先順位

From cppreference.com
< cpp‎ | language
 
 
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++演算子の優先順位と結合規則を示したものです。演算子は優先順位の高いものから順に、上から下へ記載されています。abcはオペランドです。

優先順位 Operator 説明 結合規則
1 a::b スコープ解決 左から右へ →
2 a++ a-- 後置インクリメントとデクリメント
type(a) type{a} 関数形式のキャスト
a() 関数呼び出し
a[] 添字
a.b a->b メンバアクセス
3 ++a --a 前置インクリメントとデクリメント 右から左へ ←
+a -a 単項プラスとマイナス
!a ~a 論理否定ビット単位NOT
(type)a C形式のキャスト
*a 間接参照(デリファレンス)
&a アドレス取得
sizeof Size-of[注 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 ++*pdelete(++(*p)))、単項後置演算子は常に左から右へ結合します(a[1][2]++((a[1])[2])++)。メンバアクセス演算子は単項後置演算子と同じグループに分類されますが、結合規則が意味を持つことに注意してください。a.b++(a.b)++と解析され、a.(b++)とは解析されません。

演算子の優先順位は演算子のオーバーロードの影響を受けません。例えば、std::cout << a ? b : c;は、算術左シフト演算子の優先順位が条件演算子より高いため、(std::cout << a) ? b : c;として解析されます。

[編集] 注釈

優先順位と結合規則はコンパイル時の概念であり、実行時の概念である評価順序とは独立しています。

標準規格自体は優先順位のレベルを規定していません。それらは文法から導出されます。

const_caststatic_castdynamic_castreinterpret_casttypeidsizeof...noexceptalignofは、決して曖昧にならないため、ここには含まれていません。

一部の演算子には代替の綴りがあります(例:&&に対するand||に対するor!に対するnotなど)。

C言語では、三項条件演算子は代入演算子よりも高い優先順位を持ちます。したがって、C++ではe = ((a < d) ? (a++) : (a = d))と解析される式e = a < d ? a++ : a = dは、C言語の文法的または意味的な制約により、Cではコンパイルに失敗します。詳細は対応するCのページを参照してください。

[編集] 関連項目

共通の演算子
代入 インクリメント
デクリメント
算術 論理 比較 メンバ
アクセス
その他

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
conditional

a ? b : c
特殊な演算子

static_castは、ある型を関連する別の型に変換する
dynamic_castは、継承階層内で変換する
const_castは、cv修飾子を追加または削除する
reinterpret_castは、型を関連のない型に変換する
C形式のキャストは、static_castconst_castreinterpret_castの組み合わせによって、ある型を別の型に変換する
newは、動的ストレージ期間を持つオブジェクトを作成する
deleteは、new式によって以前に作成されたオブジェクトを破棄し、取得したメモリ領域を解放する
sizeofは、型のサイズを問い合わせる
sizeof...は、パラメータパックのサイズを問い合わせる (C++11以降)
typeidは、型の型情報を問い合わせる
noexceptは、式が例外を投げる可能性があるかどうかをチェックする (C++11以降)
alignofは、型のアライメント要件を問い合わせる (C++11以降)

C言語の演算子の優先順位に関するCのドキュメント
English 日本語 中文(简体) 中文(繁體)