分享方式:


Visual Basic 中的邏輯與位元運算子

邏輯運算子會比較 Boolean 表達式並傳 Boolean 回結果。 AndOrAndAlsoOrElseXor 運算子都是二進位運算子,因為它們會採用兩個作數,而 Not 運算子是一元,因為它需要單一作數。 其中有些運算子也可以對整數值執行位邏輯運算。

一元邏輯運算符

Not 運算子表達式執行邏輯Boolean。 它會產生運算元的邏輯反向。 如果表示式評估為 True,則會 NotFalse回 ;如果表示式評估為 False,則 NotTrue回 。 下列範例說明這點。

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。 如果至少有一個表示式評估為 False,則 And 返回 False

Or 運算子會在兩個運算式上執行邏輯分離Boolean。 如果任何一個表示式的結果為 True,或兩者結果皆為 True,則 Or 返回 True。 如果兩個表示式都未評估為 True,那麼 Or 傳回 False

Xor 運算子會在兩個表達式上執行邏輯Boolean。 如果只有一個表示式的評估結果為 True,但並非兩者皆為 True,則 True 傳回 。 如果兩個表示式都評估為 True 或兩者都評估為 FalseXor 則會傳 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的值,則不會評估第二個運算式,因為它無法改變最終結果,AndAlsoFalse回。

同樣地, OrElse 運算元 會在兩 Boolean 個運算式上執行縮短邏輯分離。 如果OrElse表達式中的第一個運算式評估為True的值,則不會評估第二個運算式,因為它無法改變最終結果,OrElseTrue回。

Short-Circuiting Trade-Offs

短路運算可以藉由不評估不會改變邏輯操作結果的表達式來提升效能。 不過,如果該表達式會執行其他動作,則短路評估會跳過這些動作。 例如,如果表達式包含對程式的呼叫 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 運算子不支援位運算。

備註

位元運算只能在整數類型上執行。 浮點值必須轉換成整數類型,才能繼續位運算。

另請參閱