关于语言不可知:为什么不按位&

Why doesn't the bitwise & operator short-circuit?

我们都知道,如果左操作数是false,逻辑&&操作符就会短路,因为我们知道如果一个操作数是false,那么结果也是false

为什么位&运算符也不短路?如果左操作数是0,那么我们就知道结果也是0。我在(c,javascript,c)中测试过的每种语言都会评估两个操作数,而不是在第一个操作数之后停止。

&操作员短路是不是有什么不好的原因?如果不是,为什么大多数语言都不缩短cicuit?这似乎是一个明显的优化。


我想这是因为源语言中的按位and通常直接翻译成由处理器执行的按位and指令。反过来,在硬件中实现为一组适当数量的and门。

在大多数情况下,我不认为这是在优化任何东西。计算第二个操作数通常比测试是否应该计算它花费的成本要低。


短路不是一种优化装置。它是一种控制流量装置。如果你没有短路,你将不会得到一个稍微慢一点的程序,你将得到一个崩溃的程序。

这种短路对位运算符几乎没有意义,而且比普通的非短路运算符更昂贵。


如果编译器必须对&;的两个操作数进行检查,我想在任何正常情况下都会慢得多。


按位运算通常很便宜,检查会使运算的长度增加两倍或更多,而将逻辑运算符短路所获得的收益可能非常大。


同样的原因是,如果第一个操作数为0,*不会短路——这将是一个模糊的特殊情况,为它添加特殊的运行时测试将使所有乘法都变慢。

当操作数不是常量时,短路比不短路更昂贵,因此除非程序员明确要求,否则您不想这样做。所以你真的想要有一个干净简单的规则来决定什么时候发生。