邏輯運算子會比較 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
。 如果至少有一個表示式評估為 False
,則 And
返回 False
。
Or 運算子會在兩個運算式上執行邏輯分離或Boolean
。 如果任何一個表示式的結果為 True
,或兩者結果皆為 True
,則 Or
返回 True
。 如果兩個表示式都未評估為 True
,那麼 Or
傳回 False
。
Xor 運算子會在兩個表達式上執行邏輯Boolean
。 如果只有一個表示式的評估結果為 True
,但並非兩者皆為 True
,則 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
回。
Short-Circuiting Trade-Offs
短路運算可以藉由不評估不會改變邏輯操作結果的表達式來提升效能。 不過,如果該表達式會執行其他動作,則短路評估會跳過這些動作。 例如,如果表達式包含對程式的呼叫 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
運算子不支援位運算。
備註
位元運算只能在整數類型上執行。 浮點值必須轉換成整數類型,才能繼續位運算。