使用big if子句或堆叠它们?

Pie*_*r B 3 delphi if-statement

什么是更好的做事方式?

if f1() and f2() then...
Run Code Online (Sandbox Code Playgroud)

要么

if f1() then
  if f2() then
Run Code Online (Sandbox Code Playgroud)

要么:

fBoolean1 := f1()
fBoolean2 := f2()

if fboolean1 and fboolean2 then...
Run Code Online (Sandbox Code Playgroud)

在第一个例子中,我不确定这两个函数中的哪一个被评估.在第二个示例中,仅当f1计算为true时才会计算f2,而在第三个示例中,f1和f2都会被计算得到.

最好的方法是什么?

And*_*and 8

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

因此,在性能方面,两个第一选择更好.否则,这是一个品味问题.第二个选项将产生两个代码块,具有两级代码缩进(如果您遵循标准的缩进规则,就像您似乎那样).也许你更喜欢第一种选择.

当然,如果你需要使用返回的值f1,并f2可能几次后,第三个选项是优越的.

  • @Pieter B:不,那是不可能的,因为这会违反语言的[规范](http://docwiki.embarcadero.com/RADStudio/en/Expressions_(Delphi)#Boolean_Operators):**短路评估意味着严格的从左到右的评估,一旦确定整个表达式的结果就会停止.**通常会做一些事情,比如`if(x = 0)或(5/x = 2)then`因为一个人知道延迟评估已启用. (4认同)