AndAlso,OrElse和And,Or的區別
<原文地址:http://blog.csdn.net/batoosai/archive/2006/04/20/670530.aspx>
AndAlso和OrElse應該是vb。net引入的新運算符。
因爲用vb。net的時間還不是很長,之前我一直以爲他們和and,or根本沒有區別。
現在終於明白,他們之間還是有很大區別的:
AndAlso,OrElse相對於and,or最大的特性是會自動實現“最短路徑”。
所謂“最短路徑”就是指:當第一個被比較的運算式的結果已經能決定運算的最終結果時,就不會再去比較其他運算式,因此可以避免掉額外且不需要的比較運算式。
舉個很簡單的例子說明下:
2 Dim b As Int16 = 2
3
4 '用or的話,a=1,b=2都會被比較
5 If a = 1 Or b = 2 Then
6 'xxxxx
7 End If
8
9 '用OrElse的話,只比較了第一個條件a=1
10 If a = 1 OrElse b = 2 Then
11 'xxxx
12 End If
當用or的時候,a=1和b=2這2個條件,都會被判斷。而用orelse,則當前面一個條件(a=1)已經能決定最終結果的話,程序就不會在判斷第二個條件(b=2)了。
類似的情況還有:
2 Dim b As Int16 = 2
3
4 '用and的話,a=999,b=2,(a + b) * (b - a) = 3 都會被比較
5 If a = 999 And b = 2 And (a + b) * (b - a) = 3 Then
6 'xxxxx
7 End If
8
9 '用AndAlso的話,只比較了第一個條件a=999,由於已經是false了,所以後面的運算式不再判斷
10 If a = 999 AndAlso b = 2 AndAlso (a + b) * (b - a) = 3 Then
11 'xxxx
12 End If
當出現以上情況時,AndAlso和OrElse的效率要高於and,or。
所以,在大多數情況下,我們可以使用AndAlso和OrElse替換and,or,以提高運算效率。
<The End>
以下是MSDN上的說明:
短路運算符
邏輯運算符 AndAlso 和 OrElse 表現稱爲“短路”的行爲。短路運算符首先計算左側表達式。如果左側表達式使整個表達式爲假(在 AndAlso 中)或驗證(在 OrElse 中)整個表達式,則程序執行過程繼續,而不計算右側表達式。請見下面的示例:
If 45 < 12 AndAlso MyFunction(3) = 81 Then ' Add code to continue execution.
在此示例中,運算符計算左側表達式 45 < 12。因爲此表達式計算爲 False,所以整個邏輯表達式計算爲 False。程序執行過程因此開始執行 If 塊內的代碼,而不計算右側表達式 MyFunction(3)
。在此示例中,永遠不調用 MyFunction(),因爲左側表達式使整個表達式爲假。
同樣,如果使用 OrElse 的邏輯表達式中左側表達式計算爲 True,則執行過程繼續下一行代碼,而不計算第二個表達式,因爲第一個表達式已經啓用整個表達式。
相反,當使用邏輯運算符 And 和 Or 時,邏輯運算符的兩側都要計算。例如,請考慮下面的表達式:
If 45 < 12 And MyFunction(3) = 81 Then ' Add code to continue execution.
在此示例中,對 MyFunction() 進行調用,即使第一個表達式計算爲 False。
AndAlso 運算符
對兩個表達式執行簡化邏輯合取。
備註
如果編譯的代碼可以根據一個表達式的計算結果跳過對另一表達式的計算,則將該邏輯運算稱爲“短路”。如果第一個表達式的計算結果可以決定運算的最終結果,則不需要計算另一個表達式,因爲它不會更改最終結果。如果跳過的表達式很複雜或涉及過程調用,則短路可以提高性能。
示例
本示例使用 AndAlso 運算符對兩個表達式執行邏輯合取。結果是一個 Boolean 值,它表示整個聯合表達式是否爲真。如果第一個表達式爲 False,則不計算第二個表達式。
Dim A As Integer = 10
Dim B As Integer = 8
Dim C As Integer = 6
Dim myCheck As Boolean
myCheck = A > B AndAlso B > C ' True.
myCheck = B > A AndAlso B > C ' False. Second expression not evaluated.
myCheck = A > B AndAlso C > B ' False. Second expression evaluated.
Public Function FindValue(ByVal Arr() As Double, _
ByVal SearchValue As Double) As Double
Dim I As Integer = 0
While I <= UBound(Arr) AndAlso Arr(I) <> SearchValue
' If I is greater than UBound(Arr), SearchValue is not checked.
I += 1
End While
If I >= UBound(Arr) Then I = –1
Return I
End Function
OrElse 運算符
用於對兩個表達式執行短路邏輯析取。
備註
如果編譯的代碼可以根據一個表達式的計算結果跳過對另一表達式的計算,則將該邏輯運算稱爲“短路”。如果第一個表達式的計算結果可以決定運算的最終結果,則不需要計算另一個表達式,因爲它不會更改最終結果。如果跳過的表達式很複雜或涉及過程調用,則短路可以提高性能。
示例
本例使用 OrElse 運算符對兩個表達式執行邏輯析取。結果是一個 Boolean 值,它表示兩個表達式中是否有一個爲真。如果第一個表達式爲 True,則不計算第二個表達式。
Dim A As Integer = 10
Dim B As Integer = 8
Dim C As Integer = 6
Dim myCheck As Boolean
myCheck = A > B OrElse B > C ' True. Second expression is not evaluated.
myCheck = B > A OrElse B > C ' True. Second expression is evaluated.
myCheck = B > A OrElse C > B ' False.
If MyFunction(5) = True OrElse MyOtherFunction(4) = True Then
' If MyFunction(5) is True, MyOtherFunction(4) is not called.
' Insert code to be executed.
End If
下面來看看And 和 Or
And 運算符
對兩個 Boolean 表達式執行邏輯合取,或對兩個數值表達式執行按位合取。
注意 由於邏輯/位運算符的優先級低於其他算術和關係運算符的優先級,所以應該將任何按位運算括在括號中以確保準確執行。如果操作數包括一個 Boolean 表達式和一個數值表達式,則結果 Boolean 表達式將轉換爲數值(-1 表示 True,0 表示 False),最終將進行按位運算。
Or 運算符
用於對兩個 Boolean 表達式執行邏輯析取,或對兩個數值執行按位析取。
注意 由於邏輯/位運算符的優先級低於其他算術和關係運算符的優先級,所以應該將任何按位運算括在括號中以確保準確執行。如果操作數包括一個 Boolean 表達式和一個數值表達式,則結果 Boolean 表達式將轉換爲數值(-1 表示 True,0 表示 False),最終將進行按位運算。