Why doesn't the bitwise & operator short-circuit?
我们都知道,如果左操作数是false,逻辑&&操作符就会短路,因为我们知道如果一个操作数是false,那么结果也是false。
为什么位&运算符也不短路?如果左操作数是0,那么我们就知道结果也是0。我在(c,javascript,c)中测试过的每种语言都会评估两个操作数,而不是在第一个操作数之后停止。
让&操作员短路是不是有什么不好的原因?如果不是,为什么大多数语言都不缩短cicuit?这似乎是一个明显的优化。
- 一个原因是允许函数调用的副作用。
- 由于位运算符通常用于整数操作数(以及那些通常对应于单机器指令的操作数)的位操作,因此除了优化之外,还可以引入一个附加条件来检查罕见的0情况。为什么乘法不在0上短路?好吧,因为这是一个简单的算术运算,对应于一条机器指令,而且没有人会检查每一个乘法的0操作数。
- 如果左操作数是0xFFFFFFFF,则按位|运算符可能会短路。
我想这是因为源语言中的按位and通常直接翻译成由处理器执行的按位and指令。反过来,在硬件中实现为一组适当数量的and门。
在大多数情况下,我不认为这是在优化任何东西。计算第二个操作数通常比测试是否应该计算它花费的成本要低。
- 如果第二个操作数涉及一个昂贵的计算,这将是有益的。
- @彼得罗森是的,只有在极少数情况下,左操作数是0。记住,这里我们讨论的是整数,0的整数值比EDOCX1的布尔值(0)要少得多(即使可能比其他数字更频繁)。
短路不是一种优化装置。它是一种控制流量装置。如果你没有短路,你将不会得到一个稍微慢一点的程序,你将得到一个崩溃的程序。
这种短路对位运算符几乎没有意义,而且比普通的非短路运算符更昂贵。
- 在我看来,这一论点是站不住脚的。短路可以作为一种流量控制装置,因为它是作为一种优化而存在的。如果&&没有短路,这样的代码就永远不会有效地写入;它必须是两个独立的测试。然而,我同意位短路在实践中非常罕见,从长远来看可能更昂贵。这完全取决于调用代码上下文中左操作数的0值的可能性。
- @从定义上讲,昆兰泰勒优化只影响性能,而不影响意义。这样的代码之所以会被写入,是因为像这样编写代码是很自然的,而其他的代码则很难使用。如果没有短路,那么该语言可能会消失,取而代之的是一些不难使用的语言。
如果编译器必须对&;的两个操作数进行检查,我想在任何正常情况下都会慢得多。
按位运算通常很便宜,检查会使运算的长度增加两倍或更多,而将逻辑运算符短路所获得的收益可能非常大。
同样的原因是,如果第一个操作数为0,*不会短路——这将是一个模糊的特殊情况,为它添加特殊的运行时测试将使所有乘法都变慢。
当操作数不是常量时,短路比不短路更昂贵,因此除非程序员明确要求,否则您不想这样做。所以你真的想要有一个干净简单的规则来决定什么时候发生。