数学'不'整数

时间:2014-03-10 06:24:04

标签: delphi

为什么delphi在执行循环时执行整数的数学'not'而不是强制转换为boolean值? 示例

var myint:integer;
...
myint:=1;  
while not myint=5 do
begin
  myint:=myint+1;
  showmessage('myint now is : '+inttostr(myint));
end;    

2 个答案:

答案 0 :(得分:12)

您的表达式使用两个运算符:not=。为了理解它是如何解析的,您需要查阅operator precedence的表格。

Operators    Precedence
----------------------------
@            first (highest)
not
----------------------------
*            second
/
div
mod
and
shl
shr
as
----------------------------
+            third
-
or
xor
----------------------------
=            fourth (lowest)
<>
<
>
<=
>=
in
is
----------------------------

这表明not具有所有运算符的最高优先级,并且优先级高于=。这意味着您的表达式将被解析为:

(not myint) = 5

在这个表达式中,因为它绑定到一个整数变量,not biwise negation

为了获得您想要的结果,您必须使用括号表示您希望在not之前执行相等测试:

not (myint = 5)

现在,在此表达式中,(myint = 5)是一个逻辑表达式,因此not运算符现在是逻辑否定

这个问题的答案总是在operator precedence的表格中找到,它将为熟悉这个表格带来好处。此表将告诉您如何解析省略括号的任何表达式。

最后,正如Rudy指出的那样,使用<>运算符可以最清晰地编写您的特定表达式:

myint <> 5

答案 1 :(得分:8)

delphi这样做的原因是not运算符的顺序高于等于比较运算符。它是一个首先计算的一元运算符。事实上,在=运营商付诸实施之前,首先要计算 (当然 - 它具有最低顺序)。

要强制delphi计算你想要的东西,请使用括号:

if not (myint = 5) then....
// vs
if (not myint) = 5 then
// vs
if not myint = 5 then

如你所知,后两者是等价的。

BTW:像3+4*5这样的计算会发生类似的事情(顺序优先)。这里,乘法是在加法之前执行的,因为*运算符与+运算符相比具有更高的顺序。