Поделиться через


Арифметические операторы (F#)

В этом разделе описаны арифметические операторы, которые доступны в языке F#.

Сводка бинарных арифметических операторов

В следующей таблице кратко описаны бинарные арифметические операторы, доступные для неупакованных целочисленных типов и типов с плавающей запятой.

Бинарный оператор

Примечания

+ (сложение, плюс)

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

- (вычитание, минус)

Не помечено. Возможна потеря значимости при вычитании типов без знака, или если значения с плавающей запятой оказываются слишком маленькими для представления заданным типом.

* (умножение)

Не помечено. Возможно переполнение, когда при перемножении чисел произведение превышает максимальное абсолютное значение, поддерживаемое типом.

/ (деление)

Для целочисленных типов деление на нуль вызывает исключение DivideByZeroException. Для типов с плавающей запятой деление на нуль приводит к специальным значениям с плавающей запятой +Infinity или -Infinity. Также возможна потеря значимости, если значения с плавающей запятой оказываются слишком маленькими для представления заданным типом.

% (модуль, остаток)

Возвращает остаток от деления. Знак результата совпадает со знаком первого операнда.

** (экспонента, возведение в степень)

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

Оператор возведения в степень применим только к типам с плавающей запятой.

Сводка унарных арифметических операторов

В следующей таблице кратко описаны унарные арифметические операторы, доступные для целочисленных типов и типов с плавающей запятой.

Унарный оператор

Примечания

+ (плюс)

Может применяться к любому арифметическому выражению. Не изменяет знак значения.

- (отрицание, минус)

Может применяться к любому арифметическому выражению. Изменяет знак значения.

При возникновении переполнения или потери значимости для целых чисел происходит "циклический переход". Это приводит к появлению неверного результата. Переполнение для целых чисел представляет собой потенциально опасную проблему, которая может привести к серьезным неполадкам, если в программном обеспечении не предусмотрены соответствующие механизмы обработки подобных ситуаций. Если это важно для разрабатываемого приложения, следует рассмотреть возможность использования проверяемых операторов (Microsoft.FSharp.Core.Operators.Checked).

Сводка бинарных операторов сравнения

В следующей таблице описаны бинарные операторы сравнения, доступные для целочисленных типов и типов с плавающей запятой. Эти операторы возвращают значения типа bool.

Никогда не сравнивайте в явном виде значения чисел с плавающей запятой, поскольку представление чисел с плавающей запятой IEEE не поддерживает операцию точного равенства. Два числа, которые могут казаться равными при проверке кода, могут иметь различные битовые представления.

Оператор

Примечания

= (равенство, равняется)

Это не оператор присваивания. Он используется только для сравнения. Это универсальный оператор.

> (больше)

Это универсальный оператор.

< (меньше)

Это универсальный оператор.

>= (больше или равно)

Это универсальный оператор.

<= (меньше или равно)

Это универсальный оператор.

<> (не равно)

Это универсальный оператор.

Перегруженные и универсальные операторы

Все описанные в данном разделе операторы определены в пространстве имен Microsoft.FSharp.Core.Operators. Некоторые операторы определены с помощью статически разрешаемых параметров типов. Это значит, что имеются отдельные определения для каждого конкретного типа, поддерживающего данный оператор. К этой категории относятся все унарные и бинарные арифметические и побитовые операторы. Операторы сравнения являются универсальными и работают с любым типом, а не только с простыми арифметическими типами. У размеченного объединения и типов записей имеются собственные пользовательские реализации, которые создаются компилятором F#. Типы классов используют метод Equals.

Универсальные операторы можно настраивать. Чтобы настроить функции сравнения, переопределите метод Equals с использованием собственных правил определения равенства, а затем реализуйте интерфейс IComparable. Интерфейс IComparable содержит единственный метод — CompareTo.

Операторы и определение типа

Использование оператора в выражении ограничивает определение типа для этого оператора. Кроме того, использование операторов не допускает автоматического обобщения, поскольку использование операторов подразумевает, что операнды относятся к арифметическим типам. В отсутствии другой информации компилятор F# использует в качестве типа арифметических выражений тип int. Это поведение можно переопределить, указав другой тип. Так, предполагается, что аргументы и возвращаемое значение функции function1 в следующем фрагменте кода имеют тип int, а соответствующие значения для функции function2 — тип float.

// x, y and return value inferred to be int
// function1: int -> int -> int
let function1 x y = x + y

// x, y and return value inferred to be float
// function2: float -> float -> float
let function2 (x: float) y = x + y

См. также

Ссылки

Справочник символов и операторов (F#)

Перегрузка операторов (F#)

Побитовые операторы (F#)

Логические операторы (F#)