为什么按位和运算符没有短路?

Pet*_*son 6 language-agnostic bit-manipulation

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

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

是否有任何理由让&操作员短路是个坏主意?如果没有,为什么大多数语言都没有让它成为短暂的?这似乎是一个明显的优化.

Jer*_*fin 9

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

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

  • @PeterOlson是的,只有在极少数情况下左操作数为0.请记住,我们在这里讨论整数,整数值0比布尔值"假"更少(即使可能比其他更频繁)号). (3认同)

n. *_* m. 7

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

这种短路几乎从不对按位运算符有意义,并且比普通的非短路运算符更昂贵.

  • 这个论点对我来说似乎是倒退的。短路可以用作流量控制装置*因为*它是作为一种优化而存在的。如果“&&”没有短路,这样的代码永远不会有效编写;这必须是两个单独的测试。然而,我同意按位短路在实践中非常罕见,从长远来看它可能会更昂贵。这完全取决于调用代码上下文中左操作数为 0 值的可能性。 (2认同)