C 演算子の優先順位
以下の表は、C 演算子の優先順位と結合規則をまとめたものです。演算子は、優先順位が高い順に上から下へリストされています。
| 優先順位 | Operator | 説明 | 結合規則 |
|---|---|---|---|
| 1 | ++ --
|
後置インクリメントとデクリメント | 左から右 |
()
|
関数呼び出し | ||
[]
|
配列の添字付け | ||
.
|
構造体と共用体のメンバーアクセス | ||
->
|
ポインターを介した構造体と共用体のメンバーアクセス | ||
(型){リスト}
|
複合リテラル(C99) | ||
| 2 | ++ --
|
前置インクリメントとデクリメント[注 1] | 右から左 |
+ -
|
単項プラスとマイナス | ||
! ~
|
論理 NOT とビットごとの NOT | ||
(型)
|
キャスト | ||
*
|
間接参照 (逆参照) | ||
&
|
アドレス演算子 | ||
sizeof
|
サイズ演算子 (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)++ とは解析されません。
同じセルにある演算子 (1つのセルに複数の行の演算子がリストされている場合があります) は、指定された方向で同じ優先順位で評価されます。たとえば、式 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++) とは解析されません。
[編集] 参照
- 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 式
[編集] 関連項目
実行時における演算子引数の評価順序。
| 共通の演算子 | ||||||
|---|---|---|---|---|---|---|
| 代入 | インクリメント デクリメント |
算術 | 論理 | 比較 | メンバ アクセス |
その他 |
|
a = b |
++a |
+a |
!a |
a == b |
a[b] |
a(...) |
| C++ ドキュメント (C++ 演算子の優先順位について)
|