AndAlso,OrElse和And,Or的区别
<原文地址:http://blog.csdn.net/batoosai/archive/2006/04/20/670530.aspx>
AndAlso和OrElse应该是vb。net引入的新运算符。
因为用vb。net的时间还不是很长,之前我一直以为他们和and,or根本没有区别。
现在终于明白,他们之间还是有很大区别的:
AndAlso,OrElse相对于and,or最大的特性是会自动实现“最短路径”。
所谓“最短路径”就是指:当第一个被比较的运算式的结果已经能决定运算的最终结果时,就不会再去比较其他运算式,因此可以避免掉额外且不需要的比较运算式。
举个很简单的例子说明下:
2 Dim b As Int16 = 2
3
4 ' 用or的话,a=1,b=2都会被比较
5 If a = 1 Or b = 2 Then
6 ' xxxxx
7 End If
8
9 ' 用OrElse的话,只比较了第一个条件a=1
10 If a = 1 OrElse b = 2 Then
11 ' xxxx
12 End If
当用or的时候,a=1和b=2这2个条件,都会被判断。而用orelse,则当前面一个条件(a=1)已经能决定最终结果的话,程序就不会在判断第二个条件(b=2)了。
类似的情况还有:
2 Dim b As Int16 = 2
3
4 ' 用and的话,a=999,b=2,(a + b) * (b - a) = 3 都会被比较
5 If a = 999 And b = 2 And (a + b) * (b - a) = 3 Then
6 ' xxxxx
7 End If
8
9 ' 用AndAlso的话,只比较了第一个条件a=999,由于已经是false了,所以后面的运算式不再判断
10 If a = 999 AndAlso b = 2 AndAlso (a + b) * (b - a) = 3 Then
11 ' xxxx
12 End If
当出现以上情况时,AndAlso和OrElse的效率要高于and,or。
所以,在大多数情况下,我们可以使用AndAlso和OrElse替换and,or,以提高运算效率。
<The End>
以下是MSDN上的说明:
短路运算符
逻辑运算符 AndAlso 和 OrElse 表现称为“短路”的行为。短路运算符首先计算左侧表达式。如果左侧表达式使整个表达式为假(在 AndAlso 中)或验证(在 OrElse 中)整个表达式,则程序执行过程继续,而不计算右侧表达式。请见下面的示例:
If 45 < 12 AndAlso MyFunction(3) = 81 Then ' Add code to continue execution.
在此示例中,运算符计算左侧表达式 45 < 12。因为此表达式计算为 False,所以整个逻辑表达式计算为 False。程序执行过程因此开始执行 If 块内的代码,而不计算右侧表达式 MyFunction(3)
。在此示例中,永远不调用 MyFunction(),因为左侧表达式使整个表达式为假。
同样,如果使用 OrElse 的逻辑表达式中左侧表达式计算为 True,则执行过程继续下一行代码,而不计算第二个表达式,因为第一个表达式已经启用整个表达式。
相反,当使用逻辑运算符 And 和 Or 时,逻辑运算符的两侧都要计算。例如,请考虑下面的表达式:
If 45 < 12 And MyFunction(3) = 81 Then ' Add code to continue execution.
在此示例中,对 MyFunction() 进行调用,即使第一个表达式计算为 False。
AndAlso 运算符
对两个表达式执行简化逻辑合取。
备注
如果编译的代码可以根据一个表达式的计算结果跳过对另一表达式的计算,则将该逻辑运算称为“短路”。如果第一个表达式的计算结果可以决定运算的最终结果,则不需要计算另一个表达式,因为它不会更改最终结果。如果跳过的表达式很复杂或涉及过程调用,则短路可以提高性能。
示例
本示例使用 AndAlso 运算符对两个表达式执行逻辑合取。结果是一个 Boolean 值,它表示整个联合表达式是否为真。如果第一个表达式为 False,则不计算第二个表达式。
Dim A As Integer = 10
Dim B As Integer = 8
Dim C As Integer = 6
Dim myCheck As Boolean
myCheck = A > B AndAlso B > C ' True.
myCheck = B > A AndAlso B > C ' False. Second expression not evaluated.
myCheck = A > B AndAlso C > B ' False. Second expression evaluated.
Public Function FindValue(ByVal Arr() As Double, _
ByVal SearchValue As Double) As Double
Dim I As Integer = 0
While I <= UBound(Arr) AndAlso Arr(I) <> SearchValue
' If I is greater than UBound(Arr), SearchValue is not checked.
I += 1
End While
If I >= UBound(Arr) Then I = –1
Return I
End Function
OrElse 运算符
用于对两个表达式执行短路逻辑析取。
备注
如果编译的代码可以根据一个表达式的计算结果跳过对另一表达式的计算,则将该逻辑运算称为“短路”。如果第一个表达式的计算结果可以决定运算的最终结果,则不需要计算另一个表达式,因为它不会更改最终结果。如果跳过的表达式很复杂或涉及过程调用,则短路可以提高性能。
示例
本例使用 OrElse 运算符对两个表达式执行逻辑析取。结果是一个 Boolean 值,它表示两个表达式中是否有一个为真。如果第一个表达式为 True,则不计算第二个表达式。
Dim A As Integer = 10
Dim B As Integer = 8
Dim C As Integer = 6
Dim myCheck As Boolean
myCheck = A > B OrElse B > C ' True. Second expression is not evaluated.
myCheck = B > A OrElse B > C ' True. Second expression is evaluated.
myCheck = B > A OrElse C > B ' False.
If MyFunction(5) = True OrElse MyOtherFunction(4) = True Then
' If MyFunction(5) is True, MyOtherFunction(4) is not called.
' Insert code to be executed.
End If
下面来看看And 和 Or
And 运算符
对两个 Boolean 表达式执行逻辑合取,或对两个数值表达式执行按位合取。
注意 由于逻辑/位运算符的优先级低于其他算术和关系运算符的优先级,所以应该将任何按位运算括在括号中以确保准确执行。如果操作数包括一个 Boolean 表达式和一个数值表达式,则结果 Boolean 表达式将转换为数值(-1 表示 True,0 表示 False),最终将进行按位运算。
Or 运算符
用于对两个 Boolean 表达式执行逻辑析取,或对两个数值执行按位析取。
注意 由于逻辑/位运算符的优先级低于其他算术和关系运算符的优先级,所以应该将任何按位运算括在括号中以确保准确执行。如果操作数包括一个 Boolean 表达式和一个数值表达式,则结果 Boolean 表达式将转换为数值(-1 表示 True,0 表示 False),最终将进行按位运算。