Выберите операторы для вычислений, сравнений и условного выполнения. Правила группировки помогут прочитать результат выражения и отличить его от присваивания, которое меняет значение.
Проследите вычисление до результата
Установите Топаз по разделу Первая программа и сохраните код в operators-expressions.tpz.
function оценить(основа: int, бонус: int) -> int {
let удвоенное = основа * 2
if бонус > 0 { удвоенное + бонус } else { удвоенное }
}
let результат = оценить(20, 2)
let точно = результат == 42
let изменилось = результат != 41
print("{результат} {точно} {изменилось}")В папке с файлом выполните проверку и запуск.
topaz check operators-expressions.tpz
topaz run operators-expressions.tpzПроверка проходит, программа выводит следующий текст.
42 true trueВызов оценить(20, 2) сначала сохраняет 40 в удвоенное. Поскольку бонус положителен, ветвь if прибавляет 2 и возвращает 42. Оба сравнения дают истину. Операторы == и != сравнивают значения, не меняя привязку.
Выберите оператор по задаче
| Задача | Форма | Поведение |
|---|---|---|
| Вычислить | +, -, *, /, %, ** | Оба операнда имеют тип int либо оба имеют тип float. % принимает целые числа |
| Соединить строки | left + right | Оба операнда должны быть строками |
| Сравнить | <, <=, >, >=, ==, != | Типы операндов должны поддерживать выбранное сравнение |
| Проверить принадлежность | value in collection | Для ключей Map используйте key in map.keys |
| Соединить условия | left && right, left || right | Правая часть пропускается, если левая уже определяет результат |
| Подставить отсутствующее значение | value ?? fallback | Подставляет запасное значение при null или None |
| Передать ошибку Result | value? | Извлекает значение Ok либо возвращает Err из окружающей функции или замыкания |
| Передать значение в вызов | value |> next | Применяет правила конвейера |
| Изменить значение | target = value, +=, ??= | Выполняет инструкцию присваивания |
&& вычисляет правую часть, когда слева true. || вычисляет её, когда слева false. Пропуск ненужной части называется сокращённым вычислением. ?? также пропускает запасное значение, если слева значение уже есть.
Постфиксный ? требует совместимого возвращаемого типа Result. Передача ошибок и обработка отсутствующих значений описаны в разделе Null, Option, Result и ошибки.
Группируйте вычисления и сравнивайте значения
Покажите группировку круглыми скобками. Умножение связывает сильнее сложения, поэтому 2 + 3 * 4 даёт 14. Выражение (2 + 3) * 4 даёт 20.
Приоритет убывает в следующем порядке.
- Вызовы, индексация, доступ к членам, опциональный доступ и постфиксный
? - Возведение в степень
** - Унарные
+,-,! - Умножение, деление и остаток
- Сложение и вычитание
- Диапазоны
- Сравнение и принадлежность
&&, затем||, затем??- Композиция функций
>>, затем конвейер|>
Композиция функций описана в спецификации. В документированном способе запуска соединяйте именованные функции вызовами или оператором |>.
int хранит знаковое 64-битное целое. Деление округляется к нулю, а ненулевой остаток имеет знак делимого. Переполнение целого, деление или остаток от деления на ноль и отрицательная целая степень вызывают ошибку выполнения. В константном выражении такие операции дают ошибку проверки. float следует IEEE-754 binary64, включая бесконечность и NaN. Преобразуйте значения между int и float явно.
Примитивные значения, совместимые записи, Array, Option, Result и номинальные значения поддерживают равенство, если его поддерживает их содержимое. Массивы сравниваются по длине и порядку элементов. Номинальные значения должны происходить из одного объявления enum, record или newtype. Значения Map и Set, функции, ресурсы и шаблоны нельзя сравнивать на равенство.
Исправьте присваивание или оператор
Присваивание меняет изменяемую цель и не создаёт значения. Для проверки равенства используйте ==. Чтобы увеличить изменяемый count, напишите count = count + 1. Формы count++, count-- и count **= 2 не поддерживаются.
Битовые операторы, неявное преобразование чисел, оператор остатка для float, перегрузка операторов и пользовательские операторы не поддерживаются.
Типы операндов описаны в разделе Типы, результаты ветвей в разделе Шаблоны и управление потоком. Для соединения вызовов откройте Конвейеры и заполнители.