Visual Basic 中的逻辑运算符和按位运算符

逻辑运算符比较 Boolean 表达式并返回 Boolean 结果。 AndOrAndAlsoOrElseXor运算符是二进制的,因为它们采用两个作数,而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。 如果两个表达式的计算结果都为 TrueFalse,那么 Xor 返回 False

下面的示例演示了AndOrXor运算符。

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中的代码。

下面的示例演示了AndOr及其短路对应项之间的差异。

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运算符不支持按位运算。

注释

只能对整型类型执行按位运算。 浮点值必须转换为整数量型,之后才能进行按位操作。

另请参阅