C Operator Precedence
以下の表は、C演算子の優先順位と結合性を示しています。演算子は上から下へ、優先順位の高い順にリストされています。
| 優先順位 | 演算子 | 説明 | 結合性 |
|---|---|---|---|
| 1 |
++
--
|
後置インクリメントおよびデクリメント | 左から右へ |
()
|
関数呼び出し | ||
[]
|
配列添字 | ||
.
|
構造体および共用体メンバアクセス | ||
->
|
ポインタ経由の構造体および共用体メンバアクセス | ||
(
type
){
list
}
|
複合リテラル (C99) | ||
| 2 |
++
--
|
前置インクリメントおよびデクリメント [注 1] | 右から左へ |
+
-
|
単項プラスおよびマイナス | ||
!
~
|
論理NOTおよびビット単位NOT | ||
(
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 ++ ) とは解析されません。
参考文献
- 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++ documentation
for
C++ operator precedence
|