【发布时间】:2010-10-03 22:58:10
【问题描述】:
VB 有运算符AndAlso 和OrElse,它们执行短路 逻辑连接。
为什么这不是 And 和 Or 表达式的默认行为,因为短路在每种情况下都很有用。
奇怪的是,这与 && 和 || 执行短路的大多数语言相反。
【问题讨论】:
标签: vb6 operators language-design short-circuiting
VB 有运算符AndAlso 和OrElse,它们执行短路 逻辑连接。
为什么这不是 And 和 Or 表达式的默认行为,因为短路在每种情况下都很有用。
奇怪的是,这与 && 和 || 执行短路的大多数语言相反。
【问题讨论】:
标签: vb6 operators language-design short-circuiting
因为 VB 团队必须保持与旧代码(和程序员!)的向后兼容性
如果短路是默认行为,按位操作会被编译器错误地解释。
The Ballad of AndAlso and OrElse 来自 Panopticon Central
我们的第一个想法是逻辑运算比位运算更常见,因此我们应该将 And 和 Or 设为逻辑运算符,并添加新的位运算符 BitAnd、BitOr、BitXor 和 BitNot(最后两个是为了完整性)。然而,在其中一个测试版中,很明显这是一个非常糟糕的主意。 VB 用户忘记了新运算符的存在,并在他的意思是 BitAnd 和 Or 的意思时使用 And,当他的意思是 BitOr 时,会得到可以编译但产生“坏”结果的代码。
【讨论】:
And 或Or 的两个操作数都由关系运算符生成的代码——确实依赖于对布尔运算符两边求值的副作用。
我并不认为短路在所有情况下都有用。我只在需要时使用它。例如,当检查两个不同且未连接的变量时,就不需要了:
If x > y And y > z Then
End If
正如 Paul Vick 的文章所说明的(参见上面 Ken Browning 提供的链接),短路很有用的完美场景是首先检查对象是否存在,然后评估其属性之一.
If x IsNot Nothing AndAlso x.Someproperty > 0 Then
End If
所以,在我看来,这两个语法选项都是非常需要的。
【讨论】:
显式短路确保首先计算左操作数。
在 VB 以外的某些语言中,逻辑运算符可能会执行隐式短路,但可能会先计算右运算符(例如取决于逻辑运算符左右表达式的复杂性)。
【讨论】: