为什么不按位&操作员短路?

时间:2012-03-13 16:46:05

标签: language-agnostic bit-manipulation

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

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

0运算符短路是否有任何原因是不明智的?如果没有,为什么大多数语言都没有让它成为短暂的?这似乎是一个明显的优化。

5 个答案:

答案 0 :(得分:9)

我猜这是因为源语言中的按位and通常直接转换为由处理器执行的按位and指令。反过来,它被实现为硬件中适当数量的and门的组。

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

答案 1 :(得分:7)

短路不是优化设备。它是一种控制流设备。如果你没有短路p != NULL && *p != 0,你将不会得到一个稍慢的程序,你将得到一个崩溃的程序。

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

答案 2 :(得分:2)

按位运算通常非常便宜,以至于检查会使运算时间延长两倍或更多,而逻辑运算符短路的增益可能非常大。

答案 3 :(得分:2)

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

答案 4 :(得分:1)

出于同样的原因*如果第一个操作数为0则不会短路 - 这将是一个不起眼的特殊情况,并且为它添加​​特殊的运行时测试会使所有乘法变慢。

当操作数不是常量时,短路比不短路更昂贵,所以除非程序员明确要求,否则你不想这样做。所以你真的想要有关于何时发生的简洁规则。