具有AND运算符的语句中的成员是否始终按给定顺序进行检查?

Mar*_*ner 11 delphi logical-operators

我想知道以下代码是否可能因访问冲突而失败或是否安全.具有AND运算符的语句的第一个成员是否始终作为第一个检查,或者可能(通过某些编译器优化或其他东西)检查第二个作为第一个?

var
  Item: TSomething;

procedure DoSomething;
begin
  if Assigned(Item) and (Item.SomeProperty) then
    DoSomethingElse;
end;
Run Code Online (Sandbox Code Playgroud)

上面的代码绝对安全吗?

谢谢!

ain*_*ain 12

布尔短路评估激活的情况下,代码是安全的:

在{$ B-}状态下,编译器生成用于短路布尔表达式求值的代码,这意味着一旦整个表达式的结果从左到右的评估顺序变得明显,评估就会停止.

有点令人困惑,因为必须关闭B(或BOOLEVAL使用长名称)指令才能将短路评估切换为ON ...

另请参见运算符优先级.

  • @ain&Ulrich.我认为短路评估一直是默认的,因此包含指令将其关闭,而不是相反.在某些情况下它很有用; 我在一些错误检查代码中使用了一次,而不是找到第一个错误,找到所有错误,并通知用户.通过启用短路评估,执行该操作的代码将不太可读. (3认同)
  • 该指令永远不应该看到光明.究竟谁想要"完整"的布尔评估? (2认同)