zoukankan      html  css  js  c++  java
  • 今天才发现And和AndAlso的区别

    以前见过AndAlso,但一直都没有放在心上,也没有查资料看看它们之间到底是什么关系。采集我?4pwFK1S

    今天一看,才发现使用它们的效果是不一样的,原以为And 就和C++中的 && 一个样子(都是短路的),没想到And不短路,而AndAlso才是短路的。看来以后是该用AndAlso的就用AndAlso,该用And的就用And 。采集我?4pwFK1S

    e.g.
            Dim i As Int32
            Dim s() As String采集我?4pwFK1S

            i = 0采集我?4pwFK1S

            If i = 1 AndAlso s(1) = 1 Then
                MessageBox.Show(不可能到这里)
            Else
                MessageBox.Show(AndAlso可以短路啊)
            End If采集我?4pwFK1S

            If i = 1 And s(1) = 1 Then       '错误 其他信息: 未将对象引用设置到对象的实例。
                MessageBox.Show(不可能到这里)
            Else
                MessageBox.Show(也不可能到这里)
            End If采集我?4pwFK1S

    OrElse类似采集我?4pwFK1S

    以下是MSDN上的说明:采集我?4pwFK1S

    短路运算符

    逻辑运算符 AndAlsoOrElse 表现称为“短路”的行为。短路运算符首先计算左侧表达式。如果左侧表达式使整个表达式为假(在 AndAlso 中)或验证(在 OrElse 中)整个表达式,则程序执行过程继续,而不计算右侧表达式。请见下面的示例:采集我?4pwFK1S

    If 45 < 12 AndAlso MyFunction(3) = 81 Then ' Add code to continue execution.

    在此示例中,运算符计算左侧表达式 45 < 12。因为此表达式计算为 False,所以整个逻辑表达式计算为 False。程序执行过程因此开始执行 If 块内的代码,而不计算右侧表达式 MyFunction(3)。在此示例中,永远不调用 MyFunction(),因为左侧表达式使整个表达式为假。采集我?4pwFK1S

    同样,如果使用 OrElse 的逻辑表达式中左侧表达式计算为 True,则执行过程继续下一行代码,而不计算第二个表达式,因为第一个表达式已经启用整个表达式。采集我?4pwFK1S

    相反,当使用逻辑运算符 AndOr 时,逻辑运算符的两侧都要计算。例如,请考虑下面的表达式:采集我?4pwFK1S

    If 45 < 12 And MyFunction(3) = 81 Then ' Add code to continue execution.

    在此示例中,对 MyFunction() 进行调用,即使第一个表达式计算为 False采集我?4pwFK1S

    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.采集我?4pwFK1S

    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
    采集我?4pwFK1S

    OrElse 运算符

    用于对两个表达式执行短路逻辑析取。
    采集我?4pwFK1S

    备注

    如果编译的代码可以根据一个表达式的计算结果跳过对另一表达式的计算,则将该逻辑运算称为“短路”。如果第一个表达式的计算结果可以决定运算的最终结果,则不需要计算另一个表达式,因为它不会更改最终结果。如果跳过的表达式很复杂或涉及过程调用,则短路可以提高性能。
    示例
    本例使用 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.采集我?4pwFK1S

    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
    采集我?4pwFK1S

    下面来看看And 和 Or
    And 运算符
    对两个 Boolean 表达式执行逻辑合取,或对两个数值表达式执行按位合取。
    注意   由于逻辑/位运算符的优先级低于其他算术和关系运算符的优先级,所以应该将任何按位运算括在括号中以确保准确执行。如果操作数包括一个 Boolean 表达式和一个数值表达式,则结果 Boolean 表达式将转换为数值(-1 表示 True,0 表示 False),最终将进行按位运算。采集我?4pwFK1S

    Or 运算符
    用于对两个 Boolean 表达式执行逻辑析取,或对两个数值执行按位析取。
    注意   由于逻辑/位运算符的优先级低于其他算术和关系运算符的优先级,所以应该将任何按位运算括在括号中以确保准确执行。如果操作数包括一个 Boolean 表达式和一个数值表达式,则结果 Boolean 表达式将转换为数值(-1 表示 True,0 表示 False),最终将进行按位运算。

  • 相关阅读:
    【Android】页面切换ViewFlipper、ViewPager、ViewFlow
    【Android】9patch图片以及例子说明
    【Android】proguard混淆代码
    【iOS】ios6.0 UINavigationController支持屏幕自动旋转
    【Android】Notification官方文档归纳
    c++第一天
    c++第二天
    java第七天(布局管理器)
    Linux第一讲(韩顺平)
    java第四讲(类与对象)
  • 原文地址:https://www.cnblogs.com/snowball/p/377365.html
Copyright © 2011-2022 走看看