名前空間
変種
操作

C 演算子の優先順位

From cppreference.com
< c‎ | language

以下の表は、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 , コンマ 左から右
  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)++ とは解析されません。

同じセルにある演算子 (1つのセルに複数の行の演算子がリストされている場合があります) は、指定された方向で同じ優先順位で評価されます。たとえば、式 a=b=c は、右から左への結合規則のため、a=(b=c) と解析され、(a=b)=c とは解析されません。

[編集] 注釈

優先順位と結合規則は、評価順序とは独立しています。

標準自体は優先順位レベルを指定していません。これらは文法から導き出されます。

C++では、条件演算子は代入演算子と同じ優先順位を持ち、前置 ++-- および代入演算子にはそのオペランドに関する制限がありません。

単項演算子に対する結合規則の指定は冗長であり、完全性のためにのみ示されています。単項前置演算子は常に右から左へ結合します (sizeof ++*psizeof(++(*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++ ドキュメント (C++ 演算子の優先順位について)
English 日本語 中文(简体) 中文(繁體)