Страницы

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

четверг, 2 января 2020 г.

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

#delphi


С удивлением обнаружил, что числа с точкой могут быть целочисленно поделены на 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, для чего
нужна эта возможность?
    


Ответы

Ответ 1



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

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

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