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

Приоритет операторов определяет порядок их выполнения в сложной последовательности. Например, какая операция должна выполняться сначала в выражении 2+3*4 – сложение или умножение? Если сначала выполняется сложение, получается 5*4, то есть 20. Но если сначала выполняется умножение (как вас учили на уроках математики), получится 2+12, то есть 14. К счастью, Perl выбирает стандартное математическое определение и выполняет умножение первым. Говорят, что умножение обладает более высоким приоритетом, чем сложение.

Стандартный приоритет может переопределяться при помощи круглых скобок. Все, что находится в круглых скобках, полностью обрабатывается перед применением оператора за пределами скобок (опять же как вас учили на уроках математики). Итак, если вы хотите, чтобы сложение выполнялось перед умножением, используйте запись (2+3)*4; получается 20. А если вам вдруг захочется продемонстрировать, что умножение выполняется перед сложением, добавьте декоративную, хотя и ненужную пару круглых скобок, например 2+(3*4).

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


Правильный путь решения таких проблем – обращение к официальной, не допускающей посторонних толкований таблице приоритетов операторов Perl. (Некоторые операторы еще не упоминались в тексте, а может быть, и вовсе не появятся в этой книге, но это не помешает вам прочитать о них в manстранице perlop.)

В таблице каждый оператор обладает более высоким приоритетом, чем операторы, находящиеся под ним, и более низким приоритетом по отношению ко всем предшествующим операторам. Порядок выполнения операторов с одинаковым приоритетом определяется по правилам ассоциативности. Ассоциативность, как и приоритет, определяет порядок выполнения, когда два оператора с одинаковым приоритетом «конкурируют» за три операнда:

4 ** 3 ** 2 # 4 ** (3 ** 2), или 4 ** 9 (правоассоциативные)
72 / 12 / 3 # (72 / 12) / 3, или 6/3, то есть 2 (левоассоциативные)
36 / 6 * 3 # (36/6)*3, или 18

В первом случае оператор ** является правоассоциативным, поэтому круглые скобки подразумеваются справа. С другой стороны, операторы * и / являются левоассоциативными, поэтому и скобки подразумеваются слева. Нужно ли заучивать таблицу приоритетов? Нет! Никто этого не делает. Если вы забыли порядок следования операций и вам некогда заглядывать в таблицу, используйте круглые скобки. В конце концов, если вы не можете вспомнить приоритет операторов, такие же трудности возникнут и у программиста, занимающегося сопровождением. Пожалейте его: когда-нибудь вы можете оказаться на его месте.

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

Статьи из раздела Perl на эту тему:
Автоматическое преобразование между числами и строками
Бинарные операторы присваивания
Вещественные литералы
Встроенные предупреждения Perl
Выбор имен переменных

Вернуться в раздел: Perl / 1. Скалярные данные