Delphi 使用big if子句还是堆叠它们?

Delphi 使用big if子句还是堆叠它们?,delphi,if-statement,Delphi,If Statement,什么是更好的做事方式 if f1() and f2() then... 或 或: 在第一个示例中,我不确定这两个函数中的哪一个得到计算。在第二个示例中,只有当f1计算为真时,才会计算f2,而在第三个示例中,f1和f2都会计算 最好的方法是什么?编译器很聪明。在第一个示例中,如果f1返回false,则甚至不会调用f2(除非通过禁用延迟求值或布尔短路求值来更改默认编译器设置)。因此,第一个选项等同于第二个选项(同样,除非您更改了默认设置) 因此,就性能而言,前两个选项更好。否则,这是一个品味的问题

什么是更好的做事方式

if f1() and f2() then...

或:

在第一个示例中,我不确定这两个函数中的哪一个得到计算。在第二个示例中,只有当f1计算为真时,才会计算f2,而在第三个示例中,f1和f2都会计算


最好的方法是什么?

编译器很聪明。在第一个示例中,如果
f1
返回
false
,则甚至不会调用
f2
(除非通过禁用延迟求值或布尔短路求值来更改默认编译器设置)。因此,第一个选项等同于第二个选项(同样,除非您更改了默认设置)

因此,就性能而言,前两个选项更好。否则,这是一个品味的问题。第二个选项将产生两个代码块,具有两个级别的代码缩进(如果您像看起来那样遵循缩进的标准规则)。也许出于这个原因,您更喜欢第一种选择


当然,如果以后需要使用
f1
f2
返回的值,可能需要多次使用,第三个选项会更好。

如果
f2()
有任何副作用,第三个选项的行为会有所不同。至于你的问题,我根据上下文使用这三个词。在编程中没有教条的地方。我能看到的唯一一个因素是,如果if语句中的任何一个也有一个else,那么你会想使用第二个选项。我有点担心的是,编译器在某个时候可能会变得聪明,发现f2“更轻”然后交换求值顺序。@Pieter B:不,这是不可能的,因为这会违反语言的规则:短路求值意味着严格的从左到右求值,在确定整个表达式的结果后立即停止。人们通常会做类似于
的事情,如果(x=0)或(5/x=2),那么
,因为人们知道惰性计算是启用的。
if f1() then
  if f2() then
fBoolean1 := f1()
fBoolean2 := f2()

if fboolean1 and fboolean2 then...