Co to jest asocjatywność (dla operatora) i dlaczego jest ważna?
Zaktualizowano: asocjatywność operatora
Co to jest asocjatywność (dla operatora) i dlaczego jest ważna?
Zaktualizowano: asocjatywność operatora
Odpowiedzi:
W przypadku operatorów asocjatywność oznacza, że kiedy ten sam operator pojawia się w wierszu, to który operator zastosujemy jako pierwszy. W dalszej części pozwólmy Q
być operatorem
a Q b Q c
Jeśli Q
pozostanie asocjacyjna, zostanie oszacowana jako
(a Q b) Q c
A jeśli jest poprawnie łączny, to ocenia jako
a Q (b Q c)
To ważne, ponieważ zmienia znaczenie wyrażenia. Rozważmy operator dzielenia z arytmetyką liczb całkowitych, która jest asocjacyjna po lewej stronie
4 / 2 / 3 <=> (4 / 2) / 3 <=> 2 / 3 = 0
Gdyby było prawidłowo łączone, zwróciłoby to niezdefiniowane wyrażenie, ponieważ podzieliłbyś przez zero
4 / 2 / 3 <=> 4 / (2 / 3) <=> 4 / 0 = undefined
expr -> expr + term;
jest zespolony lewostronnie i expr -> term + expr
zespolony prawostronny.
a * b / c
ocenić, czy *
byłby lewostronny, ale /
prawostronny? Jest też sprzeczność. Myślę więc, że trzeba powiedzieć „gdy operatory o tym samym pierwszeństwie i skojarzeniu”, jeśli chcesz uwzględnić wiele operatorów.
Istnieją trzy rodzaje skojarzeń:
Własność asocjacyjna w matematyce
Kolejność operacji w językach programowania
Asocjatywność w pamięci podręcznej procesora.
Właściwość Asocjacja w matematyce jest własnością operatorów, takich jak dodawanie (+). Ta właściwość umożliwia zmianę układu nawiasów bez zmiany wartości instrukcji, tj .:
(a + b) + c = a + (b + c)
W językach programowania skojarzenie (lub stałość) operatora jest właściwością, która określa, w jaki sposób operatory o tym samym priorytecie są grupowane w przypadku braku nawiasów; tj. w jakiej kolejności oceniany jest każdy operator. Może się to różnić w zależności od języka programowania.
W pamięci podręcznej procesora asocjatywność jest metodą optymalizacji wydajności.
Prosty!!
Left Associative means we evaluate our expression from left to right
Right Associative means we evaluate our expression from right to left
Wiemy, że *, / i% mają ten sam priorytet, ale zgodnie z asocjatywnością odpowiedź może się zmienić:
Na przykład: Mamy wyrażenie: 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
ocenia do 2
, a nie 0
.
Jeśli odnosisz się do „asocjatywności operatorów” - jest to sposób, w jaki język określa sposób grupowania operatorów o tym samym priorytecie bez nawiasów.
Na przykład operatory + i - w językach opartych na języku C mają ten sam priorytet. Kiedy piszesz wyrażenie, które używa obu z nich (bez nawiasów), kompilator musi określić, w jakiej kolejności mają je oceniać.
Jeśli napiszesz 12 - 5 + 3, możliwe oceny obejmują:
W zależności od kolejności, w jakiej obliczasz wyrażenie, możesz uzyskać różne wyniki. W językach opartych na C znaki + i - pozostawiły asocjatywność, co oznacza, że powyższe wyrażenie zostanie ocenione jako pierwszy przypadek.
Wszystkie języki mają ściśle zdefiniowane reguły zarówno dotyczące pierwszeństwa, jak i asocjatywności. Możesz dowiedzieć się więcej o regułach języka C # tutaj. Ogólne koncepcje asocjatywności i pierwszeństwa operatorów są dobrze omówione na Wikipedii.
jest to kolejność oceny operatorów o tym samym priorytecie. Zlecenie od lewej do prawej lub od prawej do lewej ma znaczenie. Dla
3 - 2 - 1
jeśli jest od lewej do prawej, to tak
(3 - 2) - 1
i wynosi 0. Jeśli jest od prawej do lewej, to jest
3 - (2 - 1)
i wynosi 2. W większości języków mówimy, że operator minus ma asocjatywność od lewej do prawej.
Sytuacja 3 - 2 - 1
może wydawać się trywialna, jeśli twierdzi się, że „oczywiście robimy to od lewej do prawej”. Ale w innych przypadkach, na przykład w Rubim lub NodeJS:
$ irb
2.6.3 :001 > 2 ** 3 ** 2
=> 512
Operator **
jest „do potęgi”. Asocjatywność jest od prawej do lewej. I to jest
2 ** (3 ** 2)
co jest 2 ** 9
, to znaczy 512
, zamiast
(2 ** 3) ** 2
co jest 8 ** 2
, tj 64
.
Zakładam, że masz na myśli asocjatywność operatorów ...
To kolejność wiązania operandów z operatorem. Gruntownie:
a - b + c
można ocenić jako (przy założeniu, że - i + mają ten sam priorytet):
((a - b) + c) lub
(a - (b + c))
Jeśli operatory są pozostawione asocjacyjnie (łączą się natychmiast z lewym operandem), zostaną ocenione jako pierwsze. Jeśli są prawidłowo asocjatywne, zostaną ocenione jako drugie.
Wszyscy wiemy, że pierwszeństwo jest ważne, ale tak samo jak łączność w interpretacji znaczenia wyrażenia. Aby uzyskać naprawdę proste wprowadzenie, wypróbuj Power of Operators .
Asocjatywność podlega kolejności obliczeń w pojęciach języka programowania. Kolejność obliczeń określa znaczenie wyrażenia. Ma dwie główne zasady,
- Zasady pierwszeństwa
- Reguły kojarzenia
reguły pierwszeństwa definiują kolejność, w jakiej są oceniane „sąsiednie” operatory różnych typów. Każdy język programowania ma swoją własną tabelę pierwszeństwa operatorów dotyczącą jego operatorów.
Wracając do skojarzeń,
Definiuje kolejność wykonywania sąsiednich operacji z tym samym priorytetem. Posiada 3 smaki,
asocjatywność lewostronna asocjatywność
prawostronna
asocjatywność
Jeśli operator jest skojarzony lewostronnie, oblicza od lewej do prawej, podobnie, jeśli jest skojarzony z prawej strony, oblicza od prawej do lewej.