Сочетательность операций

Мы уже разобрались, в какой последовательности будут выполняться операции в выражениях, если приоритет операторов различен. Но как будут выполняться выражения, если содержащиеся в них операторы имеют одинаковый приоритет? Например, какое вычисление будет произведено первым в выражении а+b+с?

Чтобы ответить на этот вопрос, необходимо знать такую характеристику операторов, как сочетательность (или ассоциативность). Сочетательность можно определить как направление, в котором выполняется операция. Наиболее часто для операторов ActionScript используется общее неявное правило сочетательности слева направо. Так, а+b+с будет вычислено как (а+b)+с. Операторов, для которых характерна сочетательность справа налево, не так много. К ним относятся все операторы присваивания, условный оператор «?:», логическое отрицание «!», префиксные инкремент «++х» и декремент «--х», унарный минус «-» и поразрядное отрицание «~», а также некоторые другие.

Знание особенностей сочетательности операций позволяет не только избежать ошибок, но и порой упростить написание кода. Например, если одно и то же значение должно быть присвоено нескольким переменным, то можно использовать запись следующего вида:

а=b=с="Привет";
trace(a); // Выводит: Привет

Приведенный код работает — и связано это с тем, что оператор присваивания имеет сочетательность справа налево.


Поэтому вначале определяется переменная с, затем ее значение присваивается переменной Ь, самой же последней задается переменная а, стоящая в выражении первой. Если бы оператор «=» обладал сочетательностью слева направо, то переменные а и b имели бы значение undefined (подумайте, почему).

То, что операции в выражении обладают одинаковой сочетательностью и приоритетом, совсем не означает, что не важна их последовательность. Это обусловлено тем, что в ActionScript активно используется автоматическое преобразование типов, а многие операторы являются перегруженными. В качестве примера приведем выражение, перестановка слагаемых в котором всякий раз приводит к новому результату:

trace (""+1+2-0); // Выводит: 12
trace (1-0+2+""); // Выводит: 3
trace(-0+""+l+2); // Выводит: 012

Если вы твердо не знаете, как особенности сочетательности проявятся при вычислении некоторого сложного выражения, просто используйте для надежности несколько лишних пар круглых скобок.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Action Script на эту тему:
Арифметические операторы
Виды операторов
Логические операторы
Операторы равенства и сравнения
Поразрядные операторы

Вернуться в раздел: Action Script / 5. Операторы