Основы языка

Операторы и выражения

Выбирайте операторы для вычислений и сравнений и отличайте результат выражения от присваивания.

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

Проследите вычисление до результата

Установите Топаз по разделу Первая программа и сохраните код в operators-expressions.tpz.

TOPAZ
function оценить(основа: int, бонус: int) -> int {
    let удвоенное = основа * 2
    if бонус > 0 { удвоенное + бонус } else { удвоенное }
}

let результат = оценить(20, 2)
let точно = результат == 42
let изменилось = результат != 41

print("{результат} {точно} {изменилось}")

В папке с файлом выполните проверку и запуск.

BASH
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
Передать ошибку Resultvalue?Извлекает значение Ok либо возвращает Err из окружающей функции или замыкания
Передать значение в вызовvalue |> nextПрименяет правила конвейера
Изменить значениеtarget = value, +=, ??=Выполняет инструкцию присваивания

&& вычисляет правую часть, когда слева true. || вычисляет её, когда слева false. Пропуск ненужной части называется сокращённым вычислением. ?? также пропускает запасное значение, если слева значение уже есть.

Постфиксный ? требует совместимого возвращаемого типа Result. Передача ошибок и обработка отсутствующих значений описаны в разделе Null, Option, Result и ошибки.

Группируйте вычисления и сравнивайте значения

Покажите группировку круглыми скобками. Умножение связывает сильнее сложения, поэтому 2 + 3 * 4 даёт 14. Выражение (2 + 3) * 4 даёт 20.

Приоритет убывает в следующем порядке.

  1. Вызовы, индексация, доступ к членам, опциональный доступ и постфиксный ?
  2. Возведение в степень **
  3. Унарные +, -, !
  4. Умножение, деление и остаток
  5. Сложение и вычитание
  6. Диапазоны
  7. Сравнение и принадлежность
  8. &&, затем ||, затем ??
  9. Композиция функций >>, затем конвейер |>

Композиция функций описана в спецификации. В документированном способе запуска соединяйте именованные функции вызовами или оператором |>.

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, перегрузка операторов и пользовательские операторы не поддерживаются.

Типы операндов описаны в разделе Типы, результаты ветвей в разделе Шаблоны и управление потоком. Для соединения вызовов откройте Конвейеры и заполнители.