Go to the first, previous, next, last section, table of contents.

演算子の優先順位:演算子のネストのされ方

演算子の優先順位は、1つの式の中で、異なる演算子が接近して現れる場合の、演算子のグループ化のされ方を決定します。たとえば、`*'`+'よりも高い優先順位を持っています。したがって、a + b * cは、bcを掛け、その積にaを加えることを意味します。

演算子の優先順位は、カッコを書き加えることで変更できます。優先順位のルールは、カッコを書き加えない場合はカッコが決められていると考えることができます。実際、演算子の特殊な組み合わせがある場合は、いつでもカッコを使うのが賢明です。なぜなら、他の人がそのプログラムを読む場合、この場合に優先順位はどうなるのかを思い出せないことがあるかもしれないからです。あなたも忘れてしまうかもしれません。そしてミスを犯してしまうかもしれません。明示的にカッコを使えば、そのようなミスは防ぐことができます。

同じ優先順位の演算子が使われている場合、逆順にグループ化される代入演算子、条件演算子、指数演算子を除いて、最も左の演算子が最初にグループ化されます。したがって、a - b + c(a - b) + cのようにグループ化され、a = b = ca = (b = c)のようにグループ化されます。

前置単項演算子の優先順位は、単項演算子しか含まれていない限り問題にはなりません。なぜなら、単項演算子のパース方法は、最も奥が最初にパースされるという1つの方法しかないからです。したがって、$++i$(++i)を意味し、++$x++($x)を意味します。しかし、このオペランドのあとに他の演算子が続く場合、単項演算子の優先順位は問題になります。したがって、$x**2($x)**2を意味しますが、-x**2-(x**2)を意味します。なぜなら、`-'`**'より優先順位が低く、一方、`$'`**'より優先順位が高いからです。

以下に、awkの演算子を優先順位の低い順に示します。

代入演算子
`=', `+=', `-=', `*=', `/=', `%=', `^=', `**='。これらの演算子は右から左にグループ化されます。
条件演算子
`?:'。これらの演算子は右から左にグループ化されます。
論理"or"演算子
`||'
論理"and"演算子
`&&'
配列要素演算子
`in'
照合演算子
`~', `!~'
関係演算子およびリダイレクション演算子
関係演算子とリダイレクションは同じ優先順位レベルを持っています。`>'のような文字は、関係演算子としてもリダイレクション演算子としても機能します。コンテキストによって、その2つの意味が区別されます。 関係演算子は、`<', `<=', `==', `!=', `>=', `>'です。 I/Oリダイレクション演算子は、`<', `>', `>>', `|'です。 print文およびprintf文におけるI/Oリダイレクション演算子は、文のレベルに属し、式のレベルには属しません。リダイレクションは、他の演算子のオペランドになりうるような式を構成しません。したがって、カッコを使わずに、低い優先順位の他の演算子の近くで、リダイレクション演算子を使うのは無効です。たとえば、print foo > a ? b : cのような組み合わせは、構文エラーになります。
連接演算子
連結を表すのに特別なトークンは使われません。オペランドは単に並べて書くだけです。
加算演算子、減算演算子
`+', `-'
乗算演算子、除算演算子、剰余演算子
`*', `/', `%'
単項プラス演算子、単項マイナス演算子、単項"not"演算子
`+', `-', `!'
指数演算子
`^', `**'。これらの演算子は右から左にグループ化されます。
インクリメント演算子、デクリメント演算子
`++', `--'
フィールド演算子
`$'

Go to the first, previous, next, last section, table of contents.