(演算子の)結合性とは何ですか?なぜそれが重要なのですか?
更新:演算子の結合性
(演算子の)結合性とは何ですか?なぜそれが重要なのですか?
更新:演算子の結合性
回答:
演算子の場合、結合性とは、同じ演算子が行に表示されたときに、どの演算子の出現が最初に適用されるかを意味します。以下では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
expr -> expr + term;
左結合性でexpr -> term + expr
あり、右結合性です。
a * b / c
評価しますか?それから矛盾があります。したがって、複数の演算子をカバーしたい場合は、「同じ優先順位と結合性を持つ演算子の場合」と言う必要があると思います。*
/
結合性には次の3種類があります。
数学の結合法則は、加算(+)などの演算子のプロパティです。このプロパティを使用すると、ステートメントの値を変更せずに括弧を再配置できます。
(a + b) + c = a + (b + c)
プログラミング言語では、演算子の結合性(または固定性)は、括弧がない場合に同じ優先順位の演算子をグループ化する方法を決定するプロパティです。つまり、各演算子が評価される順序です。これはプログラミング言語間で異なる場合があります。
CPUキャッシュでは、アソシアティビティはパフォーマンスを最適化する方法です。
シンプル!!
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 % 5
評価されます。2
0
「演算子の結合性」について言及している場合、これは、括弧がない場合に同じ優先順位の演算子をグループ化する方法を言語が決定する方法です。
たとえば、Cベースの言語の+演算子と-演算子の優先順位は同じです。両方を(括弧なしで)使用する式を作成する場合、コンパイラーはそれらを評価する順序を決定する必要があります。
12-5 + 3と書くと、考えられる評価は次のようになります。
式を評価する順序に応じて、異なる結果を得ることができます。Cベースの言語では、+と-は結合性を残しています。これは、上記の式が最初のケースとして評価されることを意味します。
すべての言語には、優先順位と結合性の両方について厳密に定義されたルールがあります。C#のルールについて詳しくは、こちらをご覧ください。演算子の結合性と優先順位の一般的な概念は、ウィキペディアで詳しく説明されています。
これは、同じ優先順位の演算子の評価の順序です。LEFT TORIGHTまたはRIGHTTOLEFTの順序が重要です。ために
3 - 2 - 1
左から右の場合は
(3 - 2) - 1
は0です。右から左の場合は、
3 - (2 - 1)
ほとんどの言語では、マイナス演算子には左から右への結合性があると言われています。
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
です。
私はあなたが演算子の結合性を意味すると思います...
これは、オペランドを演算子にバインドする順序です。基本的に:
a-b + c
次のように評価される可能性があります(-と+の優先順位が同じであると仮定):
((a --b)+ c)または、
(a-(b + c))
演算子が結合性のままである場合(左側のオペランドにすぐにバインドされる)、最初の演算子として評価されます。それらが正しく結合している場合は、2番目として評価されます。
優先順位が重要であることは誰もが知っていますが、式の意味を解釈する際の結合性も重要です。本当に簡単なイントロについては、Power ofOperatorsを試してください。
結合性は、プログラミング言語の概念では計算の順序になります。計算の順序によって、式の意味が決まります。それには2つの主要なルールがあります。
- 優先ルール
- 結合規則
優先順位ルールは、さまざまなタイプの「隣接する」演算子が評価される順序を定義します。すべてのプログラミング言語には、その演算子に関する独自の演算子優先順位テーブルがあります。
結合性に戻ると、
これは、同じ優先順位で隣接する操作の実行順序を定義します。3つの味があります、
左結合性
右結合性
非結合性
演算子が左結合である場合は左から右に評価され、右結合である場合は右から左に評価されます。