0

我一直认为这是 Pascal 设计理念的一部分,即在决定用于操作的格式/精度时,它会同时查看表达式的右侧和左侧。因此,与 C 中的表达式不同,

Float_Var = 1/3

结果 Float_Var 的值为 0.0,Pascal 总是能正确处理这些内容。:)

因此,当我将两个 LongInts(32 位)相乘得到一个 Int64 结果并发现我得到异常结果时,我有点惊讶。我必须得到所有的 C 喜欢和使用,

Int64_Var := Int64(LongIntVar1) * LongIntVar2

使其正常工作。(顺便说一句。这是在Delphi下,测试了各种版本,但都是win32)。

我只是想知道这是否是 Delphi/Pascal 中的一个例外情况?或者是否还有其他示例,通常的 Pascal 方式(使用表达式两侧的类型来决定如何执行操作)不成立。

4

2 回答 2

3

如果“双方”是指它在分配中查看目标变量的类型以确定表达式类型,那么不,从未如此。在这方面,Delphi 的工作方式与任何其他主流编译器一样——也就是说,表达式的类型是由内而外确定的。

于 2013-03-14T06:15:30.543 回答
2

我一直认为这是 Pascal 设计理念的一部分,即在决定用于操作的格式/精度时,它会同时查看表达式的右侧和左侧。

这是不正确的。表达式赋值目标不影响表达式的计算。

原因是

Float_Var = 1/3;

在 C/C++ 中计算为 0 是 / 运算符重载。它可以表示整数除法或浮点除法。如果参数之一是浮点,则运算符是浮点除法,否则,如这里,它是整数除法。

在 Delphi 中,/ 运算符没有重载。它始终是浮点除法。这就是为什么这段代码会出现编译错误:

Int_Var := 1/3;
于 2013-03-14T07:02:12.900 回答