“Ors”评估整个表达吗?

时间:2014-01-24 14:24:16

标签: performance optimization logic

假设我有以下语句逻辑(我将在此示例中使用VBA,但它也适用于其他语言)

x = 1
y = 2
z = 1000
If x = 1 Or y = 2 Or z = 4 Then
     Execute Code
End

编译器或执行程序是否发现第一个值为true,然后继续Execute Code或者是否完成了语句的其余部分?

2 个答案:

答案 0 :(得分:2)

我不能代表VBA,但我可以说它是特定于语言的。在某些语言中,程序员可以使用“短路”AND和OR表达式。如果结果已经确定,则短路是不再评估布尔表达式的过程。

如果使用短路AND,如果找到FALSE,则布尔操作会提前停止。如果使用短路OR,如果找到TRUE,则布尔操作会提前停止。

例如,在Java中:

a || b是一个短路的OR

a | b是非短路的OR

a && b是一个短路的AND

a & b是非短路的AND

有些人可能会问,“为什么我会使用非短路的AND或OR?”当你调用一个返回你想在每种情况下运行的布尔值的函数时,会出现这种情况。例如,a() | b()将运行函数a和函数b。如果a返回false,则a() || b()仅运行函数b。

答案 1 :(得分:1)

我认为在vba中也可以使用OrElse。

'或'(按位比较)总是完成语句的其余部分,'OrElse'(逻辑比较)在满足要求时停止。 在C ++,C#和Java中你可以使用'|'和'||'。

例如if object is null Or object.value = ""由于尝试从空对象访问字段而导致对象为空时将导致空异常。

使用OrElse,当评估空对象时,评估if object is null OrElse object.value = ""将在第一次比较时停止。