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