gpt4 book ai didi

delphi - Delphi中if语句的求值顺序

转载 作者:行者123 更新时间:2023-12-03 02:46:01 26 4
gpt4 key购买 nike

我知道以下函数语句的答案:

if (TestFunc1()) and (TestFunc2()) then
DoSomething();

这个问题很好地回答了: Delphi 'AND' evaluation with 2 conditions

您可以通过调试或记录来轻松测试这一点。但是,您将如何测试编译器在本例中正在执行的操作(假设 ech 参数定义为 bool 值):

if (SomeObj1.bNaughtyGlobal1) and (SomeObj2.bNaughtyGlobal2) then
DoSomething();

是的,我知道参数最好隐藏在访问器函数后面......但是有没有一种聪明的方法来测试 SomeObj2 是否正在被访问?

最佳答案

答案与您链接到的问题的答案相同。作为 操作数的表达式是函数调用还是变量并不重要。如果出现以下情况,将计算第二个操作数:

  1. 未启用短路评估,或者
  2. 启用短路评估,并且第一个操作数评估为 true。

默认编译器选项启用了短路评估,并且我不知道在任何情况下更改它是有意义的。因此,假设您在启用短路评估的情况下进行编译,则当且仅当第一个操作数评估为 true 时,才会评估第二个操作数。

如果您热衷于在调试器下看到这一点,请尝试使用或不使用短路评估的程序:

{$APPTYPE CONSOLE}

type
TMyRecord = record
foo: Integer;
end;
PMyRecord = ^TMyRecord;

var
P: PMyRecord = nil;
begin
if Assigned(P) and (P.foo=1) then
Writeln;
end.

在没有短路的情况下,P.foo 的计算是一个运行时错误。通过短路评估,不会出现运行时错误。

事实上,这个具体示例是应启用短路评估的最佳理由之一。否则这样的代码将会过于冗长。

关于delphi - Delphi中if语句的求值顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29033381/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com