Поиск

Левая и правая ассоциативность

Ассоциативность определяет, какая часть выражения должна быть вычислена первой. Например, результатом приведенного выражения может быть 21 или 33 в зависимости от того, какая ассоциативность будет применяться для оператора «—»: левая или правая.

42-15-6

Оператор — имеет левую ассоциативность, т. е. сначала вычисляется 42—15, а затем из результата вычитается 6. Если бы он имел правую ассоциативность, сначала вычислялась бы правая часть выражения (15—6), а затем результат вычитался бы из 42.
Все бинарные операторы (операторы с двумя операндами), кроме операторов присваивания, — лево-ассоциативные, т. е. они обрабатывают выражения слева направо. Таким образом, а + Ь + с — то же, что и (а + Ь) + с, где сначала вычисляется а + Ъ, а затем к сумме прибавляется с. Операторы присваивания и условные операторы — право-ассоциативные, т. е. обрабатывают выражения справа налево. Иначе говоря, а=Ъ=с эквивалентно а = (Ь = с). Многие на этом спотыкаются, когда хотят поместить в одну строку несколько операторов присваивания, так что давайте рассмотрим такой код:

using System;
class RightAssocApp {
public static void Main() {
int a = 1; int b = 2; int с = 3;
Console.WriteLine("a={0} b={1} c={2>", a, b, c); a = b = c;
Console.WriteLine("После "a=b=c - : a={0} b={1} c={2}", a, b, c); > >
Результат выполнения этого примера таков:
а=1 ь=2 с=3
После 'а=Ь=с': а=3 Ь=3 о=3

Поначалу вычисление выражений справа налево может сбивать с толку, но давайте подойдем к этому так: если бы оператор присваивания был лево-ассоциативным, компилятор сначала должен был бы вычислить а = Ь, после чего а было бы равно 2, а затем b = с и в результате b было бы равно 3. Конечный результат был бы а=2 Ь=3 с=3. Очевидно, что мы ожидаем не этого, когда пишем а = b = с, и именно поэтому операторы присваивания и условные операторы право-ассоциативные.