2012-03-13 66 views
6

我们都知道如果左操作数是false,逻辑运算符&&短路,因为我们知道如果一个操作数是false,那么结果也是false为什么按位与操作符不会短路?

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

是否有任何理由让&运营商短路是一个坏主意?如果没有,为什么大多数语言都没有把它缩短 - cicuit?这似乎是一个明显的优化。

+1

原因之一是允许函数调用的副作用。 – 2012-03-13 16:53:13

+3

由于按位运算符通常用于对整数操作数进行按位运算(并且这些运算符通常对应于单个机器指令),因此除了引入用于检查罕见0情况的附加条件的优化之外,其他任何操作都不例外。为什么乘法不会在0上短路?那么,因为这是一个简单的算术运算,对应于一个机器指令,并且检查没有人会检查每个乘法运算的0操作数。 – 2012-03-13 16:53:36

+0

如果左操作数是“0xFFFFFFFF”,按位'''运算符可能会短路。 – 2012-03-13 16:59:03

回答

9

我想这是因为源语言中的位按位and通常会相当直接地转换为由处理器执行的按位and指令。这反过来又是作为硬件中适当数量的and门实现的。

我不认为这在大多数情况下优化了很多东西。评估第二个操作数的成本通常比测试要低,以确定是否应对其进行评估。

+1

如果第二个操作数涉及昂贵的计算,它将会受益。 – 2012-03-13 16:54:17

+3

@PeterOlson是的,只有在极少数情况下,左操作数为0.请记住,我们在这里讨论的是整数,整数值0比布尔值“false”更稀有(即使可能比其他号码)。 – 2012-03-13 16:56:16

2

按位操作通常非常便宜,以至于检查会使操作的时间增加两倍或更长,而逻辑操作员短路的增益可能非常大。

2

如果编译器必须为两个操作数&发出一个检查,我想你会在任何NORMAL条件下慢得多。

7

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

这种短路几乎对于按位运算符来说是没有意义的,比正常的非短路运算符更昂贵。

+1

这个说法似乎倒退了。短路可以用作流量控制装置*,因为它作为优化而存在。如果'&&'没有短路,像这样的代码永远不会写入有效;它必须是两个单独的测试。但是,我同意在实践中逐位短路将非常少见,从长远来看,这可能会更加昂贵。这一切都取决于调用代码中左操作数的0值的可能性。 – 2012-12-12 19:29:57

+0

@QuinnTaylor根据定义,优化只影响性能,而不是意义。这样的代码会被写入,因为编写这样的代码是很自然的事情,而且替代方法很尴尬。如果&&没有短路,那么语言可能会消失,并被一些不易使用的东西所取代。 – 2015-12-03 14:29:17

1

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

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

相关问题