问题
If I have the following ...
a OrElse b
... and a is True then clearly b is never evaluated. But if I add an Or
, then what?
a OrElse b Or c
Does/should c get evaluated? And what if I put in some brackets?
Apologies if this is basic. Of course I can test for the answer myself but I can't find this question answered here or elsewhere. Lots of questions dealing with Or versus OrElse but nothing dealing with Or with OrElse
回答1:
This is an operator precedence problem. The relevant documentation is here:
http://msdn.microsoft.com/en-us/library/fw84t893.aspx?ppud=4
The important excerpts:
- Operators with equal precedence are evaluated left to right in the order in which they appear in the expression.
and
Inclusive disjunction (Or, OrElse)
So what we learn here is that Or and OrElse have the same precedence and that operators with the same precedence are evaluated from left to right.
Therefore, I would expect that in cases where a
is true, b
is not evaluated. However, c
still will be. In cases where a
is false, b
is evaluated and regardless of the b
's value the Or operator will evaluate c
. So, yes, c
is always evaluated.
As a practical matter, you should generally prefer OrElse
in your code unless you have a good reason to use Or
. Or
exists now mainly for backwards compatibility.
回答2:
OrElse short circuits between the left and right side parameters (only 2 parameters). So I would say that C
will always be evaluated as you could treat this as (A OrElse B) Or C
.
MSDN OrElse
回答3:
In the case presented, c
is evaluated. A small test will tell you:
Debug.WriteLine(test(1) OrElse test(2) Or test(3))
Function test(ByVal a As Integer) As Boolean
Debug.WriteLine(a)
Return True
End Function
The above example outputs:
1 3 True
回答4:
In my personal experience VB tends to obtain the value for all of them regardless of whether they be actually evaulated or not.
This is only helpfull when order matters for items existance and the like. Just wanted to note it.
来源:https://stackoverflow.com/questions/3677703/shortcircuiting-orelse-combined-with-or