Приоритет и ассоциативность операторов Swift (с примерами)

В этой статье вы узнаете о правилах, используемых для оценки выражения с операторами и операндами.

Приоритет оператора Swift

Приоритет оператора - это набор правил, используемых для оценки данного математического выражения. Когда в одном выражении используется несколько операторов, каждая часть оценивается в определенном порядке, называемом приоритетом операторов. Некоторые операторы имеют более высокий приоритет, чем другие, что влияет на способ оценки выражения.

Таблица приоритета операторов

В таблице ниже перечислены приоритеты операторов в Swift. Чем выше он отображается в таблице, тем выше его приоритет.

Группы приоритета стандартной библиотеки Swift (от самого высокого до самого низкого)
Группы операторов Примеры
Приоритет побитового сдвига >> & <>>>
Приоритет умножения & *% & * /
Приоритет сложения | & + & - + - ^
Приоритет формирования диапазона … <…
Приоритет кастинга как есть
Приоритет нулевого слияния ??
Приоритет сравнения ! => = <= === ==
Приоритет логического соединения &&
Приоритет логической дизъюнкции ||
Приоритет по умолчанию ~>
Тернарный приоритет ?:
Функция Стрелка приоритета ()
Приоритет присвоения | =% = / = & <> = & = * = >> = << = = + = - =

Пример 1: приоритет оператора Swift

 let x = 4 + 5 * 5 print(x) 

Когда вы запустите вышеуказанную программу, результат будет:

 29

В приведенном выше примере, если вы читаете выражение слева направо, вы можете ожидать, что на выходе будет 45. Но оператор умножения имеет более высокий приоритет, чем оператор сложения, поэтому выражение 4 + 5 * 5 оценивается как 4 + (5 * 5). Поэтому print(x)выводит 29 в экран.

Шаги выполнения
Шаги Оператор Выражение Значение, возвращенное из выражения
1 * 5 * 5 25
2 + 4 + 25 29
3 знак равно печать (х) 29

Пример 2: приоритет оператора Swift с оператором сложного присваивания

 var y = 15 y += 10 - 2 * 3 print(y) 

Когда вы запустите вышеуказанную программу, результат будет:

 19

В приведенном выше примере выражение var y = 15присваивает значение 15 переменной y.

В следующем выражении y += 10 - 2 * 3оператор умножения имеет более высокий приоритет, чем оператор вычитания и составного присваивания ( +=).

Следовательно, выражение y += 10 - 2 * 3оценивается как y = y + (10 - (2 * 3)).

Шаги выполнения
Шаги Оператор Выражение Значение, возвращенное из выражения
1 знак равно var y = 15 15
2 * 2 * 3 6
3 - 10–6 4
4 + = 15 + 4 19

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

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

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

Таблица ассоциативности операторов

В таблице ниже показана ассоциативность операторов Swift и их приоритет.

Ассоциативность стандартной библиотеки Swift (приоритет от высшего к низшему)
Группы операторов Примеры Ассоциативность
Приоритет побитового сдвига >> & <>>> никто
Приоритет умножения & *% & * / осталось
Приоритет сложения | & + & - + - ^ осталось
Приоритет формирования диапазона … <… никто
Приоритет кастинга как есть никто
Приоритет нулевого слияния ?? правильно
Приоритет сравнения ! => = <= === == никто
Приоритет логического соединения && осталось
Приоритет логической дизъюнкции || осталось
Приоритет по умолчанию ~> никто
Тернарный приоритет ?: правильно
Функция Стрелка приоритета () правильно
Приоритет присвоения | =% = / = & <> = & = * = >> = << = = правильно

Пример 3: ассоциативность операторов Swift

 let x = 40 / 2 * 10 print(x) 

Когда вы запустите вышеуказанную программу, результат будет:

 200

В приведенной выше программе выражение вычисляется слева направо, поскольку операторы попадают в группы приоритета умножения и имеют левую ассоциативность. Следовательно, операция деления выполняется раньше, и вы получаете результат 200 . Что, если вы хотите сначала выполнить умножение? Вам нужно заключить 2 * 10выражение в фигурные скобки () как:

 let x = 40 / (2 * 10) print(x) 

Когда вы запустите вышеуказанную программу, результат будет:

 2

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

Интересные статьи...