【问题标题】:Does an OR statement check all criteria if it has already found a FALSE criteria? [duplicate]如果 OR 语句已经找到 FALSE 条件,它会检查所有条件吗? [复制]
【发布时间】:2015-11-23 21:55:24
【问题描述】:

在 VBA 中,当您使用 OR 语句时,处理器是否会检查所有条件,而不管它是否已经找到 FALSE 语句?

即为:

If CriteriaA OR CriteriaB OR CriteriaC OR CriteriaD Then
    Exit Function
End If

如果 CriteriaA 为假,是否会不必要地检查其他条件? CriteriaA 总是先检查吗?

我想知道,因为每项检查都需要花费大量时间,而我只需要知道其中一项是否为假。在这种情况下,我将最常失败的标准检查放在列表的第一位,这样它就会导致函数在不得不做更多工作之前失败。这是一个正确的假设吗?

【问题讨论】:

  • 是的,VB(任何版本)在这方面不像C/C++。
  • 另一个重复的 herehere
  • @IIIIIllllllllIllllIIIIIIIIlll 正如我所说,当一个或多个术语具有副作用时考虑它,即它是一个评估为布尔值但同时修改某些内容的子例程。对于初学者来说,当他看到这样的语句时,他会认为语句中的所有例程实际上都被调用了,无论语句的结果如何! Basic 系列是这样,但 C 系列不是这样。
  • @A.S.H 当时的大多数语言(实际上是我开始编程的时候)并没有很多运算符。 C 在这方面非常不寻常,并且很容易拥有任何广泛使用的语言中最多的运算符(可能除了 APL,它非常专业)。大多数语言(COBOL、BASIC、Fortran,甚至 Pascal 和 Algol)只有大约一打,因此没有按位与逻辑的额外内容。我可以向你保证,当时的讨论是不是为什么大多数语言的运算符这么少,而是“为什么 C 有这么多?
  • @RBarryYoung 感谢这一历史启示。 :)

标签: vba excel if-statement logic


【解决方案1】:

VBA 不会短路 OR 运算符(VB 也不会,需要 OrElse)。

【讨论】:

  • 他们为什么要这样设计?似乎效率低下,但也必须有优点......
  • 大部分是遗留的垃圾。因为一些旧代码会执行以下操作:if (something) or (Increment(variable)>1) then,如果短路,则变量不会增加。
  • Eww。对他们来说不是很好看。好的有道理。感谢您的帮助。
【解决方案2】:

是的,VBA 不是短路语言,所以它总是检查条件表达式的所有条件。


“为什么语言不会使用短路”这个问题的答案是here

【讨论】:

  • 很有趣,所以它往往比“短路的”慢?所以我会假设:IF A OR B OR C OR D Then Exit FunctionIF A Then Exit Function: Elseif B Then Exit Function: Elseif C Then Exit Function 慢...?
  • @teepee 好吧,VBA 是一种通常未优化的语言,因此通常它会比优化的语言慢。至于您问题中的示例,如果 A 为真,短路可能会更快,但如果只有 D 为真,那么短路可能会更快(因为它不必在每个条件后进行分支测试) ,但即使这也取决于实现。
  • @teepee VB(VB6,VBA,VB.net)在这里不做短路的真正原因是1)因为它不做真正的布尔OR操作(@987654325 @ 在 c 语言中),而是进行整数位掩码测试和操作(在 c 语言中为 |)和 2),以便表达式中的函数调用总是进行相同的次数(对于“一致性”)。跨度>
  • 好的,谢谢,这些都是很好的信息。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
相关资源
最近更新 更多