【问题标题】:Shortcircuiting: OrElse combined with Or短路:Or Else 与 Or 结合
【发布时间】:2011-04-10 07:31:33
【问题描述】:

如果我有以下...

a OrElse b 

... 并且 a 是 True 那么显然 b 永远不会被评估。但是如果我添加一个Or,那又如何呢?

a OrElse b Or c

是否/应该评估?如果我放在括号里呢?

抱歉,如果这是基本的。当然,我可以自己测试答案,但我在这里或其他地方找不到这个问题的答案。很多关于 Or OrElse 的问题,但没有涉及 Or with OrElse

【问题讨论】:

  • 对于这种性质的问题,虽然问 SO 可能更快,但一个简单的测试程序可以解决这个问题,您可以在此过程中了解更多信息。
  • @JoelEtherton:当然,事实上我在发布这个问题之前很久就写了一个简单的测试。不过,我对专家的观点很感兴趣。问题的重点是查看 JoelCoehoorn 提供的那种专家答案;不仅仅是一个答案,还有背景细节、解释和建议。

标签: vb.net operator-precedence short-circuiting


【解决方案1】:

这是一个运算符优先级问题。相关文档在这里:
http://msdn.microsoft.com/en-us/library/fw84t893.aspx?ppud=4

重要摘录:

  • 具有相同优先级的运算符按照它们在表达式中出现的顺序从左到右进行计算。

包含性析取(Or, OrElse

所以我们在这里学到的是 Or 和 OrElse 具有相同的优先级,并且具有相同优先级的运算符是从左到右计算的。

因此,我希望在a 为真的情况下,不会评估b。但是,c 仍然会。在a 为假的情况下,将评估b,并且无论b 的值如何,Or 运算符都会评估c。所以,是的,c 总是被评估。

实际上,除非您有充分的理由使用Or,否则您通常应该在代码中更喜欢OrElseOr 现在存在主要是为了向后兼容。

【讨论】:

  • 我有点困惑,因为根据文档,And 的优先级高于Or/Orelse。尽管如此,在我的程序中,当我使用test(1) OrElse test(2) And test(3) 时,我得到1true 作为输出。有什么想法吗?
  • @Anax 这正在被评估为 test(1) OrElse resultofAnd
  • @Anax 不确定。我希望 2,3,1,true 从那。我怀疑这是某种抖动优化。
  • @msarchet - 是的,但它必须首先计算 resultofAnd,因为 And 的优先级更高,这应该会导致它在 1 之前输出 2 和 3。跨度>
  • @Joel:是的,我也是这么想的。
【解决方案2】:

在本例中,评估c。一个小测试告诉你:

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

上面的例子输出:

1 3 真的

【讨论】:

    【解决方案3】:

    根据我的个人经验,VB 倾向于为所有这些都获得价值,无论它们是否被实际评估。

    这仅在订单对项目存在等很重要时才有用。只是想注意一下。

    【解决方案4】:

    OrElse 左右两侧参数短路(只有 2 个参数)。所以我想说C 将始终被评估,因为您可以将其视为(A OrElse B) Or C

    MSDN OrElse

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-13
      相关资源
      最近更新 更多