AndAlso,OrElse和And,Or的区别
vb.net吧
全部回复
仅看楼主
level 9
金炎凤凰 楼主
AndAlso和OrElse应该是vb.net引入的新运算符。
AndAlso,OrElse相对于and,or最大的特性是会自动实现“最短路径”。
所谓“最短路径”就是指:当第一个被比较的运算式的结果已经能决定运算的最终结果时,就不会再去比较其他运算式,因此可以避免掉额外且不需要的比较运算式。举个很简单的例子说明下:
1 Dim a As Int16 = 1
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)了。类似的情况还有:
1 Dim a As Int16 = 1
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 只要第一个判断式成立,则后面的运算符将不再判断,如果第一个判断式不成立,则继续执行第二个判断式,以次类推。
2012年02月19日 07点02分 1
level 5
本人人太少了。凑个热闹
[惊讶]
2012年02月19日 12点02分 2
level 8
大赞[真棒]
2015年10月06日 06点10分 3
level 2
[哈哈]
2015年10月06日 12点10分 4
level 9
长见识了 我以前感觉是一样的 汗。
2015年10月06日 12点10分 5
level 5
嗯,对的。短路运算。其实这样的逻辑运算还有一个的优点。楼主没有说到。
Dim BMP as BitBmp
...
...
If BMP isnot nothing And BMP.Width>1 then '这样会两边都计算,如果BMP没有实例化的话,就会发生错误。
If BMP isnot nothing Andalso BMP.Width>1 then ‘这样因为左边已经短路了,右边就不会计算。就是我们想要的结果了
2015年10月07日 02点10分 6
这个很酷
2015年10月08日 03点10分
回复
QQ_2286363096
:andaslo?为什么不是andelse?字母拼写乱套了。
2015年10月08日 03点10分
level 9
金炎凤凰 楼主
谢谢晕了又晕
2015年10月07日 07点10分 7
好一把洛阳铲[滑稽]
2015年10月07日 08点10分
level 7
a=1
b=10
c=3
if c>a or c>b then
msgbox “会运行”
endif
本来就是这样的吧
2015年10月08日 03点10分 9
短路运算就是当条件成立后就直接跳转。 Dim a,b,c as Int 假设a=0:b=5:c=2 if c>1 or (b\a)>1 then end if '会出错,因为有除数为0,你把or 换成orelse试试就不会出错了。因为左边成立,右边就短路跳过判断了
2015年10月09日 04点10分
@晕又晕又晕 这个那个版本开始有的代码?另外,楼猪在一楼的第4行,第5行代码我看不对啊,是or的话,只要第一个条件成立,就不需要看b是否等于2了,这个是vb一开始就有的语法好吗?
2015年10月09日 04点10分
这个你理解错了。逻辑运算符Or和And 不管左边是否成立右边都会计算的。你把我上面的代码试试看会不会报错就知道了。
2015年10月09日 04点10分
if c>a orElse c>b then 这样的话,因为c 大于 a,所以不在执行c>b,即使它成立。也不予理会。
2015年10月13日 12点10分
level 9
金炎凤凰 楼主
我又给大家一个很好理解的例子:
andalso 只要第一个判断式不成立,则后面的运算符将不再判断
orelse 只要第一个判断式成立,则后面的运算符将不再判断,如果第一个判断式不成立,则继续执行第二个判断式,以次类推。
Private Sub Button10_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button10.Click
Dim i As Int32
For i = 1 To 20
'当第一个条件不成立,AndAlso后面的表达式将不执行。若第一个表达式成立,
'则进行对第二个表达式的判断()
If i < 10 AndAlso i Mod 2 = 0 Then
Debug.Print(i & "小于10的偶数")
'若第一个判断表达式成立,则后面的运算符将不再判断,如果第一个判断
'表达式不成立,则继续执行第二个判断表达式
'以下当i<10时,第一个不成立,则去判断OrElse 后面的 i Mod 2 = 0
'当i>10时,第一个成立,程序将不再判断OrElse 后面的 i Mod 2 = 0
ElseIf i > 10 OrElse i Mod 2 = 0 Then '
Debug.Print(i & "大于10的数")
End If
Next
End Sub
End Class
运行结果:
2小于10的偶数
4小于10的偶数
6小于10的偶数
8小于10的偶数
10大于10的数
11大于10的数
12大于10的数
13大于10的数
14大于10的数
15大于10的数
16大于10的数
17大于10的数
18大于10的数
19大于10的数
20大于10的数
2015年10月13日 12点10分 10
希望这个例子能让大家很好的理解Andalso 和 orElse[呵呵]
2015年10月13日 12点10分
还有 or 和 And
2015年10月13日 12点10分
1