Panda Noir

JavaScript の限界を究めるブログでした。最近はいろんな分野を幅広めに書いてます。

演算子の右結合性、左結合性とは

なぜか演算子の結合性についての wiki 個別ページが日本語訳されてないので、右結合性、左結合性について書くことにしました。

(英語版は小学生でもわかるくらい簡単だからだれか翻訳してほしい(他力本願))

あと、この記事は英語版に準拠しています。日本語 wiki の結合性、英語 wiki と言ってることが違います

演算子の結合性とは

演算子がどっちからくっつくか、が結合性です。

例えば「・」という架空の演算子を考えます。このとき・演算子を使った式A・B・C が

  • (A・B)・C と等しい
  • A・(B・C) と等しい

上のどちらと等しいのか、あるいは両方と等しいのか。これが演算子の結合性です。

両方と等しい場合、・演算子は結合性がある といいます。 (A・B)・Cと等しい場合は ・演算子は左結合性があります。どちらとも等しくなければ 非結合性です

結合性の種類は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=3a=(b=(c=3))という順で評価されます。

非結合性

非結合性は、上に当てはまらない演算子のことです。

  • ベクトルのクロス積
  • >(大なり)、<(小なり)
  • ==、!=

などが該当します。

べき乗は右結合?左結合?

べき乗はプログラミング言語ごとに結合性が異なります。2^3^2を(2^3)^2と解釈しても、2^(3^2)と解釈しても直感的であるためです。RubyやJavaScriptでは右結合性となっています(2^(3^2))。