2009-05-30 9 views
61

(演算子のための)結合性とは何ですか?それはなぜ重要ですか?オペレータの結合性とは何ですか?それはなぜ重要ですか?

更新:オペレータ連想

+2

どのような結合性ですか?オペレータの結合性? – Ikke

+1

-1:曖昧。コンテキストに関するヒントや、あなたが知りたいことについてのヒント? –

+16

@Neil Butterworth - これは、合理的な質問のように思われる場合は特に厳しいコメントです。サイト全体のポイントは、入門用テキストで説明されているものを含む、すべてのプログラミング知識の中央リポジトリになることです。 @Jian Linが公式のFAQの最初の質問に載せられているように、あまりにも受け入れられるという彼自身のコメントに答えることにコメントしています。あなたの担当者レベルの誰かがよく知っているはずです。あなたがそれに同意しないならば、少なくともそれについての市民である。 –

答えて

65

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

(a Q b) Q c 

として評価し、それが右結合であるならば、それは

a Q (b Q c) 
として評価 Qがオペレータ

a Q b Q c 

なりましょう

式の意味を変えるので重要です。整数演算と除算演算子を考える、

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

左結合であり、それは右結合した場合、ゼロ

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

アソシエイティビティを見つける方法を知っていますか与えられた文法のために左か右か?文法に左/右の再帰的な生成規則がある場合は – user2510115

+1

です。 –

+0

例えば、 'expr - > expr + term;は左結合であり、' expr - > term + expr'は右結合である。 –

2

私は

それはオペレーターにオペランドの結合のためだ...あなたは演算子連想を意味すると仮定します。基本的に:

- B + C(仮定 - 及び+同一の優先順位を持っている)として評価されるかもしれない

: -
((B)+ C()または

- (b + c))

オペレータが左アスタリスク(左のオペランドにすぐにバインドする)のままにすると、最初のものとして評価されます。それらが正しい結合であれば、それは2番目のものとして評価されます。

7

連想の三種類がある:

The Associative property in mathematics

Order of Operations in programming languages

Associativity in CPU caches.

数学の連想性は、加算(+)演算子としての特性であるが。このプロパティは、あなたがすなわち、文の値を変更せずに、括弧を並べ替えることができます:プログラミング言語で

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

、演算子の結合性(または固定性)は、同じ優先順位の演算子がグループ化されている方法を決定するプロパティです不在カッコ内;すなわち各オペレータがどのような順序で評価されるかを示す。これはプログラミング言語によって異なる場合があります。

CPUキャッシュでは、結合性はパフォーマンスを最適化する方法です。

+0

*演算子の連想(または固定)は、同じ優先順位の演算子がカッコのないところでどのようにグループ化されるかを決定するプロパティです* - そのフレーズはわかりやすいものでした –

1

あなたは演算子連想意味場合:

それは表現が解析される方法を定義します。それは標準を与えるので、すべての式は同じ方法で解析されます。

副作用が存在する可能性がある場合、同じ優先順位を持つ操作の場合は、ほとんどの場合重要です。

3

で割ることになるので、それは、未定義の発現を評価するであろう、それは順序であります同じ優先順位の演算子を評価する。左から右へ、または右から左への順序が重要です。それは左から右にされている場合

3 - 2 - 1 

ため、それは

(3 - 2) - 1 

であり、それは右から左にある場合、それは

3 - (2 - 1) 

であり、それは2であり、0です。ほとんどの言語では、マイナス演算子にはLEFT TO RIGHT結合があります。

+3

による整数除算や剰余は、なぜあなたは質問をしたのですか? –

+2

それは新しい人を助けることでした。私は長年前にC言語を覚えていたことを覚えていて、後になるまでどのような結合性が本当にあるかを知らなかった –

+3

私は、Cを学ぶ人のほとんどがあなたの "助け"なしでやることができると思う。たとえば、 –

4

「演算子の結合性」とは、かっこがないときに同じ優先度の演算子がどのようにグループ化されるかを言語がどのように決定するかです。

たとえば、C言語の+演算子と - 演算子は同じ優先順位を持ちます。あなたは(括弧なし)、それらの両方を使用して式を記述する場合、コンパイラは、それらを評価するために、どのような順序を決定する必要があります

あなたは12書けば - 5 + 3を、可能性の評価は、次のとおりです。

  1. を( 12 - 5)+ 3 = 10
  2. 12 - あなたが式を評価する順序によっては(5 + 3)= 4

は、あなたは異なる結果を得ることができます。 Cベースの言語では、+と - は結合性を残しています。つまり、上記の式が最初のケースとして評価されます。

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

+0

すべてのオペランドが同じオペランドを使用していれば、サンプルはより明確になります。 –

+0

同じ優先順位を持つ2つの演算子が括弧を付けない式に現れたが、そのうちの1つが結合性を残し、もう1つが正しいとしたらどうなりますか?最初に見つけた演算子の結合性を使うだけでしょうか? – Hector

0

上記の例のほとんどは定数を使用しています。引数が関数呼び出しである場合、呼び出しが行われる順序は、もちろん、コンパイラに応じて、関連規則によって決定されます。これらの関数に副作用がある場合。

0

優先順位は重要であるが、式の意味を解釈する際の結合性も重要である。本当にシンプルなイントロについては、Power of Operatorsを試してみてください。

2

シンプル!! 左アソシエートは、左から右に式を評価することを意味します。

右の関連性は、右から左の表現を評価することを意味します。

私たちが知っている*、/および%は同じ優先順位を持っていますが、連想に従って答えが変わる可能性があります。例えばについて

:私はEXP:4 * 8/2%5

左結合:(4×8)/ 2%5 ==>(32/2)%5 ==> 16 %5 ==> 1

右連想: 4 * 8 /(2〜5%)==> 4 *(8/0)==>未定義の動作

私はこれが役立つだろう願っています。 。 。

関連する問題