为什么delphi在执行循环时执行整数的数学'not'而不是强制转换为boolean值? 示例
var myint:integer;
...
myint:=1;
while not myint=5 do
begin
myint:=myint+1;
showmessage('myint now is : '+inttostr(myint));
end;
答案 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
这样的计算会发生类似的事情(顺序优先)。这里,乘法是在加法之前执行的,因为*
运算符与+
运算符相比具有更高的顺序。