С удивлением обнаружил, что числа с точкой могут быть целочисленно поделены на 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 в операциях, если исходное значение не подходит для операции оно конвертируется в подходящее по определенным правилам. Правила указаны в специальной таблице.
Комментариев нет:
Отправить комментарий