【问题标题】:Why can I divide Single by Variant in Delphi, and what is it for?为什么我可以在 Delphi 中将 Single 除以 Variant,它的用途是什么?
【发布时间】:2017-03-22 06:47:20
【问题描述】:

我很惊讶地看到,浮点值可以除以 Delphi 中的 Variant。一个简单的例子说明可以做什么:

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 中将 Single 除以 Variant,它需要什么?

【问题讨论】:

  • 这只是变体类型强制。变体旨在允许尽可能多的类型转换。如果您想了解更多原因,那么您应该查看 MS COM 文档。

标签: delphi floating-point variant


【解决方案1】:

来自Variants in Expressions

如果表达式将变体与静态类型值组合在一起,则静态类型值会自动转换为变体。

这意味着浮点类型的文字首先被转换为变体。

然后在执行 div/mod 操作之前,两个变体都被隐式转换为整数值以匹配运算符。 Variant Type Conversions

..它有什么用?

只是为了尽可能多才多艺并完全支持 OLE。

【讨论】:

  • 你不认为这个类型是为了匹配 COM 变体类型而设计的吗?
  • @DavidHeffernan,好吧,这太明显了。更新了答案。谢谢。
  • 为了挑剔,我认为“OLE”在这里不是正确的术语。应该是“COM”。
  • @Kobik,OLE 自动化使用 OleVariants 来传递数据。 COM 也可以传递 OleVariant 数据。可以说 COM 是 OLE 的实现部分,很多时候这两个术语可以互换使用。 Marco Cantu 在他的一本书中说 Delphi 变体库是为支持 OLE 而构建的。 "To provide full OLE support, the 32-bit version of Delphi includes the Variant data type."
猜你喜欢
  • 2022-01-31
  • 2016-12-05
  • 2021-12-09
  • 2021-05-11
  • 1970-01-01
  • 2010-09-27
  • 2011-12-17
  • 2010-11-21
相关资源
最近更新 更多