Panda Noir

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

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

なぜか日本語wikiにないright associativity、left associativity。小学生でもわかるくらい簡単だからだれか翻訳してもいいのではないですかね(他力本願)

あと、最初に言いたいのですが、Wikiの結合性のところ、英語Wikiと言ってることが違います。この記事は英語版に準拠しています。

演算子の結合性とは

演算子がどっちからくっつくか、ということです。

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

  • (A・B)・C と同じか
  • A・(B・C) と同じか

この違いです。

結合性の種類4つ

結合性には大きくわけて2種類、さらに分けて4種類あります。

  • 結合性
  • 非結合性(3種類)
    • 左結合性
    • 右結合性
    • 非結合性

結合性

結合性を満たす演算子には「+」や「*」があります。結合性とは、以下の条件のことです。

ある二項演算子・があり、常にA・B・C=(A・B)・C=A・(B・C)を満たす。

「+」も「*」もこれを満たすので、結合性があります。

左結合性

左結合性は、結合性がないもののうち、以下のようなものです。

ある二項演算子・があり、常に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))という順で評価されることから明らかです。

非結合性

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

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

などが該当します。

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

べき乗はプログラミング言語ごとに結合性が異なります。2^3^2を(2^3)^2としても2^(3^2)としても直感的には不自然でないのが原因です。RubyやJavaScriptでは右結合性となっています(2^(3^2))。