演算子の結合性とは何ですか?なぜそれが重要なのですか?


88

(演算子の)結合性とは何ですか?なぜそれが重要なのですか?

更新:演算子の結合性


2
どんな結合性?演算子の結合性?
ikke 2009年

26
@Neil Butterworth-それは、合理的な質問のように思われることに対する特に厳しいコメントです。このサイトの要点は、紹介テキストでカバーされているものを含むすべてのプログラミング知識の中央リポジトリになることです。@Jian Linが、公式FAQの最初の質問に記載されているように、それも受け入れられるという彼自身のコメントに答えていることにコメントしてください。あなたの担当者レベルの誰かがもっとよく知っているはずです。あなたがそれに同意しない場合は、少なくともそれについて礼儀正しくしてください。
ロブ・アレン

1
@RobAllen彼の他の投稿を参照してください。また、私は彼が自分の投稿に答えるべきではないとは言いませんでしたが、それは役に立たなかっただけです。そして、私はあなたに取引をします-あなたが私の言い回しの仕方を教えてくれなければ、ここであなたの投稿の言い回しの仕方を教えません。

回答:


105

演算子の場合、結合性とは、同じ演算子が行に表示されたときに、どの演算子の出現が最初に適用されるかを意味します。以下ではQ、演算子になります

a Q b Q c

Qが結合性のままの場合、次のように評価されます。

(a Q b) Q c

そして、それが正しい結合性である場合、それは次のように評価されます

a Q (b Q c)

それは表現の意味を変えるので、それは重要です。整数算術を使用した除算演算子について考えてみます。これは結合性のままです。

4 / 2 / 3    <=>    (4 / 2) / 3    <=> 2 / 3     = 0

それが正しい結合性である場合、ゼロで除算するため、未定義の式に評価されます

4 / 2 / 3    <=>    4 / (2 / 3)    <=> 4 / 0     = undefined

与えられた文法に対して左か右かにかかわらず、結合性を見つける方法を知っていますか?
user2510115 2013年

1
たとえば、expr -> expr + term;左結合性でexpr -> term + exprあり、右結合性です。
スビンセバスチャン2014

15
回答の最初の行では、「同じ演算子が表示されたとき」ではなく、「同じ優先順位の演算子が表示されたとき」と言う方が適切です。例:a * b / c =>ここで、*と/の優先順位は同じです。
1O1 2014

2
@ 1O1に感謝しますが、同じ優先順位を持つ演算子の結合性が異なる場合はどうなりますか?左結合であるが右結合であるかどうかをどのようにa * b / c評価しますか?それから矛盾があります。したがって、複数の演算子をカバーしたい場合は、「同じ優先順位と結合性を持つ演算子の場合」と言う必要があると思います。*/
Johannes Schaub-litb 2017年

2
@Markわかりませんが、どのように機能するか考えられません。おそらく追加の
スタックオーバーフローの

13

結合性には次の3種類があります。

数学の結合法則

プログラミング言語での演算の順序

CPUキャッシュの結合性。

数学の結合法則は、加算(+)などの演算子のプロパティです。このプロパティを使用すると、ステートメントの値を変更せずに括弧を再配置できます。

(a + b) + c = a + (b + c)

プログラミング言語では、演算子の結合性(または固定性)は、括弧がない場合に同じ優先順位の演算子をグループ化する方法を決定するプロパティです。つまり、各演算子が評価される順序です。これはプログラミング言語間で異なる場合があります。

CPUキャッシュでは、アソシアティビティはパフォーマンスを最適化する方法です。


3
演算子の結合性(または固定性)は、同じ優先順位の演算子は、括弧の不存在下でグループ化されている方法を決定するプロパティですそのフレーズは、ちょうど私が理解するために完璧だった-
ラファエルEyng

7

シンプル!!

Left Associative means we evaluate our expression from left to right

Right Associative means we evaluate our expression from right to left 

*、/、および%の優先順位は同じですが、結合性により、回答が変わる可能性があります。

例:式があります:4 * 8/2%5

Left associative:   (4 * 8) / 2 % 5 ==> (32 / 2) % 5 ==> 16 % 5 ==> 1

Right associative:  4 * 8 /(2 % 5) ==>  4 * ( 8 / 2) ==> 4 * 4 ==> 16

2
答えにエラーがあるようです:ではなく、に2 % 5評価されます。20
60055

5

「演算子の結合性」について言及している場合、これは、括弧がない場合に同じ優先順位の演算子をグループ化する方法を言語が決定する方法です。

たとえば、Cベースの言語の+演算子と-演算子の優先順位は同じです。両方を(括弧なしで)使用する式を作成する場合、コンパイラーはそれらを評価する順序を決定する必要があります。

12-5 + 3と書くと、考えられる評価は次のようになります。

  1. (12-5)+ 3 = 10
  2. 12-(5 + 3)= 4

式を評価する順序に応じて、異なる結果を得ることができます。Cベースの言語では、+と-は結合性を残しています。これは、上記の式が最初のケースとして評価されることを意味します。

すべての言語には、優先順位と結合性の両方について厳密に定義されたルールがあります。C#のルールについて詳しくは、こちらをご覧ください。演算子の結合性優先順位の一般的な概念は、ウィキペディアで詳しく説明されています。


すべて同じオペランドを使用すると、例がより明確になります。
マイケルカーマン

同じ優先順位の2つの演算子が括弧のない式に表示されたが、一方が結合性を残し、もう一方が右であった場合はどうなるでしょうか。最初に見つけた演算子の結合性を使用するだけでしょうか?
ヘクター

同じ優先順位は同じ結合性を意味するため、発生することはありません。そうでなければ、現実の存在そのものを脅かす曖昧さである可能性があります。
Ankur S 2018

5

これは、同じ優先順位の演算子の評価の順序です。LEFT TORIGHTまたはRIGHTTOLEFTの順序が重要です。ために

3 - 2 - 1

左から右の場合は

(3 - 2) - 1

は0です。右から左の場合は、

3 - (2 - 1)

ほとんどの言語では、マイナス演算子には左から右への結合性があると言われています。

2020年の更新:

3 - 2 - 1主張が「もちろん私たちは左から右にそれをする」であるならば、についての状況は些細なことに思えるかもしれません。ただし、RubyやNodeJSで実行する場合など、その他の場合は次のようになります。

$ irb
2.6.3 :001 > 2 ** 3 ** 2
 => 512 

これ**は「の力」の演算子です。結合性は右から左です。そしてそれは

 2 ** (3 ** 2)

これは2 ** 9、すなわち、512代わりの

(2 ** 3) ** 2

これは8 ** 2、つまり、64です。


4
あなたがすでに答えを知っているなら、なぜあなたは質問をしたのですか?
ロバートハーベイ

6
それは新しい人々を助けることでした。私はずっと前にCを学んだことを覚えていて、結合性が実際に何であるかを後でまで知りませんでした。
非極性2009年

3
Cを学ぶほとんどの人はあなたの「助け」なしでできると思います。

1
たとえば、結合性は同じ演算子に制限されていますか、それとも同じ優先順位レベルの演算子用ですか?多くの人が本や参考文献をチェックせずに確実にそれに答えることができますか?
非極性2009年

13
@ニールバターワース、なぜそんなに敵対的?あなた自身の質問に対する答えを投稿することは許容できると思います。これはFAQにあり、ポッドキャストで何度か言及されています。
ジェイコンロッド

3

私はあなたが演算子の結合性を意味すると思います...

これは、オペランドを演算子にバインドする順序です。基本的に:

a-b + c

次のように評価される可能性があります(-と+の優先順位が同じであると仮定):

((a --b)+ c)または、
(a-(b + c))

演算子が結合性のままである場合(左側のオペランドにすぐにバインドされる)、最初の演算子として評価されます。それらが正しく結合している場合は、2番目として評価されます。


1

演算子の結合性を意味する場合:

式の解析方法を定義します。これは標準を提供するため、すべての式が同じ方法で解析されます。

副作用が発生する可能性がある場合、同じ前例を持つ操作で最も重要です。


0

前の例のほとんどは定数を使用しています。引数がたまたま関数呼び出しである場合、呼び出しが行われる順序は、もちろんコンパイラーに応じて、アソシエーションルールによって決定される場合があります。そして、それらの機能に副作用がある場合..


0

優先順位が重要であることは誰もが知っていますが、式の意味を解釈する際の結合性も重要です。本当に簡単なイントロについては、Power ofOperatorsを試してください。


0

結合性は、プログラミング言語の概念では計算の順序になります。計算の順序によって、式の意味が決まります。それには2つの主要なルールがあります。

  1. 優先ルール
  2. 結合規則

優先順位ルールは、さまざまなタイプの「隣接する」演算子が評価される順序を定義します。すべてのプログラミング言語には、その演算子に関する独自の演算子優先順位テーブルがあります。

結合性に戻ると、

これは、同じ優先順位で隣接する操作の実行順序を定義します。3つの味があります、

左結合性
右結合性
非結合性

演算子が左結合である場合は左から右に評価され、右結合である場合は右から左に評価されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.