逻辑运算符比较 Boolean
表达式并返回 Boolean
结果。
And
、Or
、AndAlso
OrElse
和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
和Or
Xor
运算符。
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
始终返回正值或零值。
和AndAlso
OrElse
运算符不支持按位运算。
注释
只能对整型类型执行按位运算。 浮点值必须转换为整数量型,之后才能进行按位操作。