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








