名前空間
変種
操作

C の演算子の優先順位

提供: cppreference.com
< c‎ | language

以下の表は C の演算子の優先順位と結合性の一覧です。 演算子は優先順位の高いものから低いものへ、上から下に並べられています。

優先順位 演算子 説明 結合性
1 ++ -- 後置インクリメント、デクリメント 左結合
() 関数呼び出し
[] 配列の添字
. 構造体および共用体のメンバアクセス
-> ポインタを通した構造体および共用体のメンバアクセス
(type){list} 複合リテラル(C99)
2 ++ -- 前置インクリメント、デクリメント 右結合
+ - 正号、負号
! ~ 論理否定、ビット単位の論理否定
(type) 型キャスト
* 間接参照 (逆参照)
& アドレス取得
sizeof サイズ取得[注釈 1]
_Alignof アライメント要件(C11)
3 * / % 乗算、除算、剰余 左結合
4 + - 加算、減算
5 << >> ビット単位の左シフト、右シフト
6 < <= 関係演算子 < ≤
> >= 関係演算子 > ≥
7 == != 関係演算子 = ≠
8 & ビット単位の論理積
9 ^ ビット単位の排他的論理和
10 | ビット単位の論理和
11 && 論理積
12 || 論理和
13[注釈 2] ?: 三項条件[注釈 3] 右結合
14 = 単純代入
+= -= 加算、減算による複合代入
*= /= %= 乗算、除算、剰余による複合代入
<<= >>= ビット単位の左シフト、右シフトによる複合代入
&= ^= |= ビット単位の論理積、排他的論理和、論理和による複合代入
15 , コンマ 左結合
  1. sizeof の被演算子に型キャストは使用できません。 式 sizeof (int) * psizeof((int)*p) ではなく (sizeof(int)) * p として曖昧性なく解釈されます。
  2. 架空の優先順位です。 下のノートを参照してください。
  3. 条件演算子の中央の式 (?: の間) は括弧で囲まれているかのように解析され、 ?: との相対的な優先順位は無視されます。

式を解析するとき、ある優先順位を持つ行に掲載されている演算子は、それより低い優先順位を持つ行に掲載されているいかなる演算子よりも、その引数をよりタイトに (括弧で囲まれたかのように) 束縛します。 例えば、式 *p++(*p)++ ではなく *(p++) と解析されます。

同じセル内の演算子は同じ優先順位を持ち、その結合性の方向に引数を束縛します。 例えば、式 a=b=c は、右結合であるため、 (a=b)=c ではなく a=(b=c) と解析されます。

[編集] ノート

優先順位と結合性は評価順序とは無関係です。

C 言語標準は演算子の優先順位を規定していません。 標準は言語の文法を規定しているのであり、優先順位表は理解を簡単にするために文法から導き出したものです。 文法の一部は優先順位表によって表すことができません。 代入式は条件演算子の右側の被演算子として使用することができません。 そのため e = a < d ? a++ : a = d は解析できない式であり、そのため条件演算子と代入演算子の相対的な優先順位は簡単に記述できません。

しかし、多くのコンパイラは ?:= より高い優先順位を持つ非標準な式文法を使用しており、先程の式を e = ( ((a < d) ? (a++) : a) = d ) と解析します (ただし意味的な制約によってコンパイルに失敗します。 ?:左辺値となることはなく、 = は左に変更可能な左辺値を要求するためです)。 このページの表はそれを表しています。

これは C++ では異なることに注意してください。 C++ では条件演算子は代入と同じ優先順位を持ちます。

単項演算子に対する結合性の仕様は冗長であり、完全を期すためにのみ示しています。 単項前置演算子は常に右結合であり (sizeof ++*psizeof(++(*p)) です)、単項後置演算子は常に左結合です (a[1][2]++((a[1])[2])++ です)。 メンバアクセス演算子は、単項後置演算子に分類されていても、結合性に意味があることに注意してください。 a.b++a.(b++) ではなく (a.b)++ と解析されます。

[編集] 参考文献

  • C11 standard (ISO/IEC 9899:2011):
  • A.2.1 Expressions
  • C99 standard (ISO/IEC 9899:1999):
  • A.2.1 Expressions
  • C89/C90 standard (ISO/IEC 9899:1990):
  • A.1.2.1 Expressions

[編集] 関連項目

実行時の被演算子の評価順序

一般的な演算子
代入 インクリメント
デクリメント
算術 論理 比較 メンバアクセス その他

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
? :
sizeof
_Alignof
(C11およびそれ以降)

C++の演算子の優先順位C++リファレンス