Що таке асоціативність (для оператора) і чому це важливо?
Оновлено: асоціативність оператора
Що таке асоціативність (для оператора) і чому це важливо?
Оновлено: асоціативність оператора
Відповіді:
Для операторів асоціативність означає, що коли той самий оператор з'являється в рядку, тоді який оператор ми застосовуємо першим. Далі нехай 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
оцінити, якщо *
було б ліво-асоціативним, але /
було б право-асоціативним? Тоді виникає суперечність. Тому я думаю, що потрібно сказати "коли оператори з однаковим пріоритетом та асоціативністю", якщо ви хочете охопити декілька операторів.
Існує три види асоціативності:
Асоціативна властивість у математиці
Порядок операцій на мовах програмування
Асоціативність у кешах процесора.
Асоціативна властивість у математиці - це властивість таких операторів, як додавання (+). Ця властивість дозволяє переставляти дужки, не змінюючи значення оператора, тобто:
(a + b) + c = a + (b + c)
У мовах програмування асоціативність (або фіксованість) оператора є властивістю, яка визначає, як оператори одного і того ж пріоритету групуються за відсутності дужок; тобто в якому порядку оцінюється кожен оператор. Це може відрізнятися між мовами програмування.
У кешах центрального процесора асоціативність - це метод оптимізації продуктивності.
Просто !!
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
.
Якщо ви маєте на увазі "асоціативність операторів" - це те, як мова визначає, як оператори того самого пріоритету групуються за відсутності дужок.
Наприклад, оператори + та - у мовах на основі С мають однаковий пріоритет. Коли ви пишете вираз, який використовує їх обидва (без дужок), компілятор повинен визначити, в якому порядку їх оцінювати.
Якщо ви пишете 12 - 5 + 3, можливі оцінки включають:
Залежно від того, в якому порядку ви оцінюєте вираз, ви можете отримати різні результати. У мовах, заснованих на C, + та - залишили асоціативність, що означає, що вираз вище буде оцінено як перший випадок.
Усі мови мають чітко визначені правила як першочерговості, так і асоціативності. Ви можете дізнатись більше про правила для C # тут. Загальні поняття асоціативності та пріоритетності операторів добре висвітлені у Вікіпедії.
це порядок оцінки для операторів того самого пріоритету. Важливий порядок ВЛІВО ВПРАВО або ПРАВО ВЛІВО. Для
3 - 2 - 1
якщо це ВЛІВО ВПРАВО, то це так
(3 - 2) - 1
і дорівнює 0. Якщо це ПРАВО НАЛІВО, то це так
3 - (2 - 1)
і воно дорівнює 2. У більшості мов ми говоримо, що оператор мінус має асоціативність ВЛІВО ВПРАВО.
Ситуація щодо 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))
Якщо оператори залишаються асоціативними (прив'язуються відразу до лівого операнда), це буде оцінено як перший. Якщо вони правильно асоціюються, це буде оцінено як друге.
Ми всі знаємо, що пріоритет є важливим, але також важливим є асоціативність у тлумаченні значення виразу. Для справді простого вступу спробуйте Power of Operators .
Асоціативність підпадає під порядок обчислень у поняттях мови програмування. Порядок обчислення визначає значення виразу. Він має два основних правила,
- Правила переваги
- Правила асоціативності
правила пріоритету визначають порядок, в якому оцінюються "суміжні" оператори різних типів. Кожна мова програмування має власну таблицю пріоритетів операторів щодо своїх операторів.
Повертаючись до асоціативності,
Він визначає порядок виконання суміжних операцій з однаковим пріоритетом. Він має 3 смаки,
ліва-асоціативність
права-асоціативність
неасоціативність
Якщо оператор лівоасоціативний, він обчислює зліва направо так само, якщо правоасоціативний - справа наліво.