我一直认为它是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方式,使用表达式两边的类型来决定操作的执行方式,并不成立。
答案 0 :(得分:3)
如果“双方”意味着它在用于确定表达式类型的赋值中查看目标变量的类型,那么不,从来就不是这种情况。在这方面,Delphi的工作方式与其他主流编译器类似 - 也就是说,表达式的类型由内而外决定。
答案 1 :(得分:2)
我一直认为这是设计理念的一部分 帕斯卡,它看着左右两边 决定使用什么格式/精度时的表达式 进行手术。
这是不正确的。表达式分配目标不会影响表达式的评估。
原因
Float_Var = 1/3;
在C / C ++中求值为0是/运算符过载。它可以表示整数除法或浮点除法。如果其中一个参数是浮点,那么运算符是浮点除法,否则,就像这里一样,它是整数除法。
在Delphi中,/运算符不会过载。它总是浮点除法。这就是为什么这段代码会产生编译错误:
Int_Var := 1/3;