なぜか演算子の結合性についての wiki 個別ページが日本語訳されてないので、右結合性、左結合性について書くことにしました。 (英語版は小学生でもわかるくらい簡単だからだれか翻訳してほしい(他力本願))
この記事は英語版に準拠しています。日本語 wiki の結合性は英語 wiki と言ってることが違います。
演算子の結合性とは
演算子がどっちからくっつくか、が結合性です。
「・」という架空の演算子を考えます。このとき・演算子を使った式A・B・C は以下のどちらなのか、が結合性です。
- (A・B)・C と等しい
- A・(B・C) と等しい
両方と等しい場合、・演算子は結合性がある といいます。 (A・B)・Cのみと等しい場合は ・演算子は左結合性があります。
たとえば「+」は結合性の演算子です(1+2+3 = (1+2)+3 = 1+(2+3))。「-」は左結合性の演算子です (1-2-3 = (1-2)-3 だが 1-2-3 != 1-(2-3))。
結合性の種類は4つ
結合性には大きく2つに分けられます(結合性と非結合性)。非結合性はさらに3種類に分かれます。
- 結合性
- 非結合性(3種類)
- 左結合性
- 右結合性
- 非結合性
結合性
結合性の演算子には「+」や「*」があります。結合性とは、以下の条件のことです。
「ある二項演算子・があり、常にA・B・C=(A・B)・C=A・(B・C)を満たす」
「+」も「*」もこれを満たすので、結合性の演算子です。
x + y + z = (x + y) + z = x + (y + z)
左結合性
左結合性は、結合性がないもののうち、以下のようなものです。
ある二項演算子・があり、常にA・B・C=(A・B)・Cを満たす。
これは「-」や「/」が該当します。例えば 1-2-3 は (1-2)-3 と等しいですが、1-(2-3) とは等しくありません。たしかに左結合性の条件を満たしています。
右結合性
右結合性は左結合性と逆です。
ある二項演算子・があり、常にA・B・C=A・(B・C)を満たす。
右結合性の演算子には、代入演算子があります。実際、a=b=c=3 は a=(b=(c=3))という順で評価されます。
非結合性
非結合性は、上に当てはまらない演算子のことです。
- ベクトルのクロス積
- >(大なり)、<(小なり)
- ==、!=
などが該当します。
べき乗は言語ごとに結合性が異なる
べき乗はプログラミング言語ごとに結合性が異なります。2^3^2を(2^3)^2と解釈しても、2^(3^2)と解釈しても直感的であるためです。RubyやJavaScriptでは右結合性となっています(2^(3^2))。