演算子の優先順位
例えば$ a + b \times c とした場合、数学的には掛け算$ b \times cの方を優先して結合する。つまり$ a + ( b \times c )となる。
プログラミング言語により使える演算子が異なること、また一般的ではない演算子の優先度は数学的には決まっていないことから、優先順位は必ずしも一致しない。
ただし、C言語を参考にしているケースが多いため、そこまでずれることはない。
「括弧」なども優先順位に入ることがある。(というか入れないとうまく構文解析できない)
C言語の演算子の優先順位
table:c_operator_priority
優先順位 演算子 説明
1 () 左から右 括弧内の式
2 [] 左から右 配列の添字
. 構造体メンバアクセス(オブジェクト)
-> 構造体メンバアクセス(ポインタ)
++ -- 後置インクリメント/デクリメント
3 ++ -- 右から左 前置インクリメント/デクリメント
+- 単項プラス/マイナス
! ~ 論理否定/ビット単位否定
(型名) キャスト
* ポインタの逆参照
& アドレス演算子
sizeof オブジェクトのサイズ
_Alignof 型のアラインメント
4 * / % 左から右 乗算/除算/剰余
5 + - 左から右 加算/減算
6 << >> 左から右 ビット単位の左シフト/右シフト
7 < <= 左から右 小なり/小なりイコール
>= 大なり/大なりイコール
8 == != 左から右 等値/非等値
9 & 左から右 ビット単位AND
10 ^ 左から右 ビット単位XOR
11 | 左から右 ビット単位OR
12 && 左から右 論理AND
13 || 左から右 論理OR
14 ?: 右から左 条件演算子
15 = 右から左 代入
+= -= 加算代入/減算代入
*= /= %= 乗算代入/除算代入/剰余代入
<<= >>= 左シフト代入/右シフト代入
&= ^= |= ビット単位AND代入/XOR代入/OR代入
16 , 左から右 コンマ
構文解析では、BNF記法で階層構造のように定義するか、演算子順位文法(operator precedence grammar)を使うことで優先度順を表現している。
数と括弧と加算と乗算しかないケースの例
BNF 記法の場合
優先度ごとにその項目に名前を付ける必要がある。これがかなり厄介。
code:bnf
式 := "(" 式 ")" | 加算式 | 数
加算式 := 乗算式 "+" 乗算式 | 乗算式
乗算式 := 式 "*" 式
演算子順位文法の場合(大雑把にこういう定義をする。)
BNF 記法を使うより直感的。
code:operator_priority
演算子
"*" 2項演算子 優先度1 左結合
"+" 2項演算子 優先度2 左結合
括弧
"(" 優先度1 開く
")" 優先度1 閉じる
左結合と右結合
左結合の場合 a op b op c は ((a op b) op c) と解釈される。
右結合の場合 a op b op c は (a op (b op c)) と解釈される。
関連