(演算子の)結合性とは何ですか?なぜそれが重要なのですか?
更新:演算子の結合性
演算子の場合、結合性とは、同じ演算子が連続して表示されたときに、どの演算子の出現が最初に適用されるかを意味します。以下では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
結合性には次の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
これは、同じ優先順位の演算子の評価の順序です。LEFTTORIGHTまたは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
です。
「演算子の結合性」について言及している場合、これは、括弧がない場合に同じ優先順位の演算子をグループ化する方法を言語が決定する方法です。
たとえば、Cベースの言語の+演算子と-演算子の優先順位は同じです。それらの両方を(括弧なしで)使用する式を作成する場合、コンパイラーはそれらを評価する順序を決定する必要があります。
12-5 + 3と書くと、考えられる評価は次のようになります。
式を評価する順序に応じて、異なる結果を得ることができます。Cベースの言語では、+と-は結合性を残しています。これは、上記の式が最初のケースとして評価されることを意味します。
すべての言語には、優先順位と結合性の両方について厳密に定義されたルールがあります。C#のルールについて詳しくは、こちらをご覧ください。演算子の結合性と優先順位の一般的な概念は、ウィキペディアで十分にカバーされています。
私はあなたが演算子の結合性を意味すると思います...
これは、オペランドを演算子にバインドする順序です。基本的に:
a-b + c
次のように評価される可能性があります(-と+の優先順位が同じであると仮定):
((a --b)+ c)または、
(a-(b + c))
演算子が結合性のままである場合(左側のオペランドにすぐにバインドされる)、最初の演算子として評価されます。それらが正しく結合している場合は、2番目として評価されます。
演算子の結合性を意味する場合:
式の解析方法を定義します。これは標準を提供するため、すべての式が同じ方法で解析されます。
副作用が発生する可能性がある場合、同じ前例を持つ操作で最も重要です。
前の例のほとんどは、定数を使用しています。引数がたまたま関数呼び出しである場合、呼び出しが行われる順序は、もちろんコンパイラに応じて、関連付けルールによって決定される場合があります。そして、それらの関数に副作用がある場合..
優先順位が重要であることは誰もが知っていますが、式の意味を解釈する際の結合性も重要です。非常に簡単な導入については、Power of Operators を試してください。
結合性は、プログラミング言語の概念における計算の順序の下にあります。計算の順序によって、式の意味が決まります。それには主に2つのルールがあり、
- 優先ルール
- 結合規則
優先順位規則は、異なるタイプの「隣接する」演算子が評価される順序を定義します。すべてのプログラミング言語には、その演算子に関する独自の演算子優先順位表があります。
結合性に戻ると、
同じ優先順位で隣接する操作の実行順序を定義します。3つの味があり、
左の結合性
右の結合性
非結合性
演算子が左結合の場合は左から右に評価され、右結合の場合は右から左に評価されます。