Страницы

Поиск по вопросам

среда, 9 января 2019 г.

Почему я могу выполнить div для числа с точкой и Варианта в Делфи?

С удивлением обнаружил, что числа с точкой могут быть целочисленно поделены на Variant в Delphi. Простой пример:
var v: Variant; begin v := 2.3; Tag := 5.1 div v; // 2 Tag := 5.1 mod v; // 1 Tag := 5.1 div 2; // [dcc32 Error] E2015 Operator not applicable to this operand type Tag := 5.1 mod 2; // [dcc32 Error] E2015 Operator not applicable to this operand type end;
Похоже, что Delphi округляет левую и правую часть выражения перед выполнением div/mod операторов.
Я полагал, что вышенаписанный код вызовет ошибку при компилировании всех 4 строк, т.к. в моем понимании, операторы div/mod не применимы к числам с точкой от слова "совсем". Похоже что это не так.
Почему Delphi дает мне целочисленно поделить число с точкой на Variant, для чего нужна эта возможность?


Ответ

В справке по типу Variant есть следующее
If an expression combines variants with statically-typed values, the statically-typed values are automatically converted to variants.

Если в выражении используются переменные вариантных типов и статически-типизированные значения, статически-типизированные значения автоматически приводятся к вариантному типу.

В справке по операторам
Except for ^, is, and in, all operators can take operands of type Variant;

Все операторы, кроме ^, is и in могут принимать операнды с типом Variant.
Из этого следует, что в выражениях
Tag := 5.1 div v; // 2 Tag := 5.1 mod v; // 1
число 5.1 было приведено к типу Variant

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

Комментариев нет:

Отправить комментарий