C 演算子の優先順位
次の表は、C 演算子の優先順位と結合性を示しています。演算子は優先順位の高い順に上から下にリストされています。
| 優先順位 | 演算子 | 説明 | 結合性 |
|---|---|---|---|
| 1 | ++ --
|
接尾辞/後置インクリメントおよびデクリメント | 左から右 |
()
|
関数呼び出し | ||
[]
|
配列の添字付け | ||
.
|
構造体および共用体のメンバアクセス | ||
->
|
ポインタを通じた構造体および共用体のメンバアクセス | ||
(type){list}
|
複合リテラル(C99) | ||
| 2 | ++ --
|
接頭辞インクリメントおよびデクリメント[1] | 右から左 |
+ -
|
単項プラスおよびマイナス | ||
! ~
|
論理否定およびビット否定 | ||
(type)
|
キャスト | ||
*
|
間接参照(デリファレンス) | ||
&
|
アドレス取得 | ||
sizeof
|
サイズ取得[2] | ||
_Alignof
|
アライメント要件(C11) | ||
| 3 | * / %
|
乗算、除算、剰余 | 左から右 |
| 4 | + -
|
加算および減算 | |
| 5 | << >>
|
ビット単位左シフトおよび右シフト | |
| 6 | < <=
|
関係演算子 < および ≤ 用 | |
> >=
|
関係演算子 > および ≥ 用 | ||
| 7 | == !=
|
関係演算子 = および ≠ 用 | |
| 8 | &
|
ビット単位 AND | |
| 9 | ^
|
ビット単位 XOR(排他的論理和) | |
| 10 | |
|
ビット単位 OR(包含的論理和) | |
| 11 | &&
|
論理 AND | |
| 12 | ||
|
論理 OR | |
| 13 | ?:
|
三項条件演算子[3] | 右から左 |
| 14[4] | =
|
単純代入 | |
+= -=
|
加算および減算による代入 | ||
*= /= %=
|
乗算、除算、剰余による代入 | ||
<<= >>=
|
ビット単位左シフトおよび右シフトによる代入 | ||
&= ^= |=
|
ビット単位 AND、XOR、OR による代入 | ||
| 15 | ,
|
コンマ | 左から右 |
- ↑ 接頭辞
++および--のオペランドはキャスト式であってはなりません。この規則は文法的に、意味的に無効な式を禁止します。一部のコンパイラはこの規則を無視し、意味的に無効性を検出します。 - ↑ のオペランドはキャスト式であってはなりません: 式
sizeofはsizeof (int) * pとして明確に解釈され、(sizeof(int)) * pではありません。sizeof((int)*p)ではありません。 - ↑ 条件演算子の中央の式 (
?と:の間) は、括弧で囲まれているかのように解析されます:?:に対するその優先順位は無視されます。 - ↑ 代入演算子の左オペランドは単項式(レベル2の非キャスト式)でなければなりません。この規則は文法的に、意味的に無効な式を禁止します。多くのコンパイラはこの規則を無視して意味的に無効性を検出します。例えば、
e = a < d ? a++ : a = dはこの規則のために解析できない式です。しかし、多くのコンパイラはこの規則を無視してe = ( ((a < d) ? (a++) : a) = d )として解析し、その後意味的に無効であるためエラーを出します。
式を解析するとき、ある行にリストされている演算子は、その下の行にリストされているどの演算子よりも、その引数に(括弧で囲まれているかのように)強く結合します。例えば、式 *p++ は *(p++) として解析され、(*p)++ としては解析されません。
同じセルにある演算子(セル内に複数の行の演算子がリストされている場合があります)は、同じ優先順位で、指定された方向に評価されます。例えば、式 a = b = c は a = (b = c) として解析され、右から左への結合性のため (a = b) = c としては解析されません。
注意
優先順位と結合性は 評価順序 とは独立しています。
標準自体は優先順位のレベルを指定していません。それらは文法から導き出されます。
C++ では、条件演算子は代入演算子と同じ優先順位を持ち、接頭辞 ++ および -- と代入演算子にはそのオペランドに関する制限はありません。
結合性の指定は単項演算子では冗長であり、完全性のためにのみ示されています: 単項接頭辞演算子は常に右から左に結合し (sizeof ++*p は sizeof(++(*p)))、単項接尾辞演算子は常に左から右に結合します (a[1][2]++ は ((a[1])[2])++)。結合性はメンバアクセス演算子にとって意味があることに注意してください。ただし、これらは単項接尾辞演算子とグループ化されています: a.b++ は (a.b)++ として解析され、a.(b++) としては解析されません。
参考文献
- C23 規格 (ISO/IEC 9899:2024):
- A.3.1 式
- C17 規格 (ISO/IEC 9899:2018):
- A.2.1 式
- C11 規格 (ISO/IEC 9899:2011):
- A.2.1 式
- C99 規格 (ISO/IEC 9899:1999):
- A.2.1 式
- C89/C90 規格 (ISO/IEC 9899:1990):
- A.1.2.1 式
関連項目
実行時における演算子引数の評価順序。
| 一般的な演算子 | ||||||
|---|---|---|---|---|---|---|
| 代入 | インクリメント デクリメント |
算術 | 論理 | 比較 | メンバ アクセス |
その他 |
|
|
|
|
|
|
|
|
C++ ドキュメント C++ 演算子の優先順位
|