В этой статье вы узнаете о правилах, используемых для оценки выражения с операторами и операндами.
Приоритет оператора 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
Вам не нужно запоминать таблицу приоритетов и ассоциативную таблицу. В большинстве случаев приоритет и ассоциативность операторов имеют смысл сами по себе. В случае сомнений вы всегда можете воспользоваться таблицей для справки. Также лучше использовать скобки, чтобы облегчить понимание кода.








