名前空間
変種
操作

C++の演算子の優先順位

提供: cppreference.com
< cpp‎ | language
 
 
C++言語
一般的なトピック
フロー制御
条件付き実行文
繰り返し文 (ループ)
ジャンプ文
関数
関数宣言
ラムダ関数宣言
inline 指定子
例外指定 (非推奨)
noexcept 指定子 (C++11)
例外
名前空間
指定子
decltype (C++11)
auto (C++11)
alignas (C++11)
記憶域期間指定子
初期化
演算子
演算子の優先順位
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点
文字 - 文字列 - nullptr (C++11)
ユーザ定義 (C++11)
ユーティリティ
属性 (C++11)
typedef 宣言
型エイリアス宣言 (C++11)
キャスト
暗黙の変換 - 明示的な変換
static_cast - dynamic_cast
const_cast - reinterpret_cast
メモリ確保
クラス
クラス固有の関数特性
特別なメンバ関数
テンプレート
その他
 
一般
値カテゴリ (lvalue, rvalue, xvalue)
評価順序 (副作用完了点)
定数式
未評価式
一次式
ラムダ式(C++11)
リテラル
整数リテラル
浮動小数点リテラル
ブーリアンリテラル
文字リテラル および エスケープシーケンス
文字列リテラル
ヌルポインタリテラル(C++11)
ユーザ定義リテラル(C++11)
演算子
代入演算子: 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||b, a&&b, !a
比較演算子: a==b, a!=b, a<b, a>b, a<=b, a>=b, a<=>b(C++20)
メンバアクセス演算子: a[b], *a, &a, a->b, a.b, a->*b, a.*b
その他の演算子: a(...), a,b, a?b:c
デフォルト比較(C++20)
演算子の代替表現
優先順位と結合性
畳み込み式(C++17)
new 式
delete 式
throw 式
alignof
sizeof
sizeof...(C++11)
typeid
noexcept(C++11)
演算子オーバーロード
変換
暗黙の変換
const_cast
static_cast
reinterpret_cast
dynamic_cast
明示的な変換 (T)a, T(a)
ユーザ定義変換
 

以下の表は C++ の演算子の優先順位と結合性の一覧です。 演算子は優先順位の高いものから低いものへ、上から下に並べられています。

優先順位 演算子 説明 結合性
1 :: スコープ解決 左結合
2 a++   a-- 後置インクリメント、デクリメント
type()   type{} 関数スタイルのキャスト
a() 関数呼び出し
a[] 添字
.   -> メンバアクセス
3 ++a   --a 前置インクリメント、デクリメント 右結合
+a   -a 正号、負号
!   ~ 論理否定ビット単位の論理否定
(type) C スタイルのキャスト
*a 間接参照 (逆参照)
&a アドレス取得
sizeof サイズ取得[注釈 1]
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 演算子
= 直接代入 (C++ のクラスに対してデフォルトで提供されます)
+=   -= 加算、減算による複合代入
*=   /=   %= 乗算、除算、剰余による複合代入
<<=   >>= ビット単位の左シフト、右シフトによる複合代入
&=   ^=   |= ビット単位の論理積、排他的論理和、論理和による複合代入
17 , コンマ 左結合
  1. sizeof の被演算子に C スタイルの型キャストは使用できません。 式 sizeof (int) * psizeof((int)*p) ではなく (sizeof(int)) * p と曖昧性なく解釈されます。
  2. 条件演算子の中央の式 (?: の間) は括弧で囲まれているかのように解析され、 ?: との相対的な優先順位は無視されます。

式を解析するとき、ある優先順位を持つ行に掲載されている演算子は、それより低い優先順位を持つ行に掲載されているいかなる演算子よりも、その引数をよりタイトに (括弧で囲まれたかのように) 束縛します。 例えば、式 std::cout << a & bstd::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 ++*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_cast, static_cast, dynamic_cast, reinterpret_cast, typeid, sizeof..., noexcept, alignof は、曖昧になることは決してないため、掲載していません。

いくつかの演算子には代替表現があります (例えば && に対する and|| に対する or! に対する not など)。

三項条件演算子と代入演算子の相対的な優先順位は C と C++ で異なることに注意してください。 C では代入を三項条件演算子の右側に置くことはできず、 e = a < d ? a++ : a = d は解析できません。 多くの C コンパイラでは ?:= より高い優先順位を持つように修正された文法を使用しており、先程の式を e = ( ((a < d) ? (a++) : a) = d ) と解析します (C では ?: が左辺値となることはなく、 = は左側に左辺値を要求するため、これはその後、コンパイルに失敗します)。 C++ では、 ?:= は同じ優先順位を持ち、右結合であるため、 e = a < d ? a++ : a = de = ((a < d) ? (a++) : (a = d)) と解析されます。

[編集] 関連項目

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

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[b]
*a
&a
a->b
a.b
a->*b
a.*b

a(...)
a, b
? :

特殊な演算子

static_cast は型を別の関連する型に変換します。
dynamic_cast は継承階層内で変換します。
const_castcv 修飾子を追加または削除します。
reinterpret_cast は型を無関係の型に変換します。
C スタイルのキャストstatic_cast, const_cast, reinterpret_cast の混合によって型を別の型に変換します。
new は動的記憶域期間を持つオブジェクトを作成します。
delete は以前に new 式によって作成されたオブジェクトを破棄し、取得したメモリ領域を解放します。
sizeof は型のサイズを照会します。
sizeof...パラメータパックのサイズを照会します。 (C++11およびそれ以降)
typeid は型の型情報を照会します。
noexcept は式が例外を投げることができるかどうかを調べます。 (C++11およびそれ以降)
alignof は型のアライメント要件を照会します。 (C++11およびそれ以降)

Cの演算子の優先順位C言語リファレンス