Namespaces
Variants

C Operator Precedence

From cppreference.net

以下の表は、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 , コンマ演算子 左から右へ
  1. 前置 ++ および -- のオペランドは型キャストにできません。この規則は文法的に、意味的には無効な式をいくつか禁止します。一部のコンパイラはこの規則を無視し、意味的に無効であることを検出します。
  2. sizeof のオペランドは型キャストにできません:式 sizeof ( int ) * p は明確に ( sizeof ( int ) ) * p と解釈され、 sizeof ( ( int ) * p ) とは解釈されません。
  3. 条件演算子の中間の式( ? : の間)は、括弧で囲まれているかのように解析されます: ?: に対する優先順位は無視されます。
  4. 代入演算子の左オペランドは単項式(レベル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 + = 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 - > b
a. b

a ( ... )
a, b
( type ) a
a ? b : c
sizeof


_Alignof
(C11以降)
(C23まで)

alignof
(C23以降)

C++ documentation for C++ operator precedence