逻辑运算符比较 Boolean 表达式并返回 Boolean 结果。
And、Or、AndAlsoOrElse和Xor运算符是二进制的,因为它们采用两个作数,而Not运算符是一元运算符,因为它需要单个作数。 其中一些运算符还可以对整型值执行按位逻辑运算。
一元逻辑运算符
Not 运算符对表达式执行逻辑Boolean。 它生成其操作数的逻辑相反值。 如果表达式的计算结果为 True,则 Not 返回 False;如果表达式的计算结果 False为,则 Not 返回 True。 下面的示例对此进行了演示。
Dim x, y As Boolean
x = Not 23 > 14
y = Not 23 > 67
' The preceding statements set x to False and y to True.
二进制逻辑运算符
And 运算符对两个 表达式执行逻辑与运算。Boolean 如果两个表达式的计算结果 True为,则 And 返回 True。 如果至少有一个表达式的计算结果 False为,则 And 返回 False。
Or 运算符对两个表达式执行逻辑分离或Boolean。 如果任一表达式的计算结果为True,或者两者的计算结果都为True,则Or返回True。 如果这两个表达式的计算结果都不是 True,那么 Or 将返回 False。
Xor 运算符对两个表达式执行逻辑Boolean。 如果只有一个表达式的计算结果是True,而不是两个都满足这个条件,Xor 会返回 True。 如果两个表达式的计算结果都为 True 或 False,那么 Xor 返回 False。
下面的示例演示了And和OrXor运算符。
Dim a, b, c, d, e, f, g As Boolean
a = 23 > 14 And 11 > 8
b = 14 > 23 And 11 > 8
' The preceding statements set a to True and b to False.
c = 23 > 14 Or 8 > 11
d = 23 > 67 Or 8 > 11
' The preceding statements set c to True and d to False.
e = 23 > 67 Xor 11 > 8
f = 23 > 14 Xor 11 > 8
g = 14 > 23 Xor 8 > 11
' The preceding statements set e to True, f to False, and g to False.
Short-Circuiting 逻辑操作
AndAlso 运算符与And运算符非常相似,因为它还对两Boolean个表达式执行逻辑连。 两者之间的主要区别在于 AndAlso 表现出 短路 行为。 如果表达式中的第一个表达式的计算结果为AndAlso,则不会计算第二个False表达式,因为它无法更改最终结果,并AndAlso返回False。
同样,OrElse 运算符对两个 Boolean 表达式执行短路逻辑析取。 如果表达式中的第一个表达式的计算结果为OrElse,则不会计算第二个True表达式,因为它无法更改最终结果,并OrElse返回True。
短路利弊分析
短路可以通过不计算不会影响逻辑运算结果的表达式来提高性能。 但是,如果该表达式执行其他操作,则短路将跳过这些操作。 例如,如果表达式包含对 Function 过程的调用,则表达式在短路时不调用该过程,并且不包含运行的任何其他 Function 代码。 因此,函数可能只偶尔运行,并且可能无法正确测试。 或者程序逻辑可能依赖于代码 Function中的代码。
下面的示例演示了And、Or及其短路对应项之间的差异。
Dim amount As Integer = 12
Dim highestAllowed As Integer = 45
Dim grandTotal As Integer
If amount > highestAllowed And checkIfValid(amount) Then
' The preceding statement calls checkIfValid().
End If
If amount > highestAllowed AndAlso checkIfValid(amount) Then
' The preceding statement does not call checkIfValid().
End If
If amount < highestAllowed Or checkIfValid(amount) Then
' The preceding statement calls checkIfValid().
End If
If amount < highestAllowed OrElse checkIfValid(amount) Then
' The preceding statement does not call checkIfValid().
End If
Function checkIfValid(ByVal checkValue As Integer) As Boolean
If checkValue > 15 Then
MsgBox(CStr(checkValue) & " is not a valid value.")
' The MsgBox warning is not displayed if the call to
' checkIfValid() is part of a short-circuited expression.
Return False
Else
grandTotal += checkValue
' The grandTotal value is not updated if the call to
' checkIfValid() is part of a short-circuited expression.
Return True
End If
End Function
在前面的示例中,请注意,调用短路时,内部 checkIfValid() 的某些重要代码不会运行。 由于 If 不会短路,因此即使 checkIfValid() 返回 12 > 45,第一个 False 语句也会调用 And。 第二个If语句不调用checkIfValid(),因为当12 > 45返回False时,AndAlso会使第二个表达式短路。 即使If返回checkIfValid(),第三个12 < 45语句仍会调用True,因为Or不会短路。 第四个If语句不调用checkIfValid(),因为当12 < 45返回True时,OrElse会短路第二个表达式。
按位运算
位运算以二进制 (base 2) 形式计算两个整数值。 它们会比较相应位置上的位,然后根据比较结果来分配值。 下面的示例演示了 And 运算符。
Dim x As Integer
x = 3 And 5
前面的示例将值 x 设置为 1。 发生这种情况的原因如下:
这些值被视为二进制值:
二进制格式的 3 = 011
二进制形式的 5 = 101
And运算符会比较二进制表示形式,一次比较一个二进制位置(位)。 如果给定位置处的两个位均为 1,则在结果中将 1 置于该位置。 如果任一位为 0,则在结果中将 0 置于该位置。 在前面的示例中,此方法如下所示:011 (二进制形式为 3)
101 (二进制形式为 5)
001 (结果,采用二进制形式)
结果被视为十进制。 值 001 是 1 的二进制表示形式,因此
x= 1。
按位 Or 运算类似,但如果两个比较位中有一个或两个均为 1,则将 1 分配至结果位。
Xor 如果比较位(不是两者)之一正好是 1,则为结果位分配 1。
Not 采用单个操作数,反转所有位,包括符号位,并将该值赋给结果。 这意味着,对于有符号正数, Not 始终返回负值,对于负数, Not 始终返回正值或零值。
和AndAlsoOrElse运算符不支持按位运算。
注释
只能对整型类型执行按位运算。 浮点值必须转换为整数量型,之后才能进行按位操作。