我们都知道如果左操作数是&&
,逻辑false
运算符会短路,因为我们知道如果一个操作数是false
,那么结果也是{{1} }}
为什么按位false
运算符也不会短路?如果左操作数是&
,那么我们知道结果也是0
。我在(C,Javascript,C#)中测试过的每种语言都会评估两个操作数,而不是在第一个之后停止。
让0
运算符短路是否有任何原因是不明智的?如果没有,为什么大多数语言都没有让它成为短暂的?这似乎是一个明显的优化。
答案 0 :(得分:9)
我猜这是因为源语言中的按位and
通常直接转换为由处理器执行的按位and
指令。反过来,它被实现为硬件中适当数量的and
门的组。
在大多数情况下,我认为这不是优化任何东西。评估第二个操作数通常比测试成本低于是否应该评估它。
答案 1 :(得分:7)
短路不是优化设备。它是一种控制流设备。如果你没有短路p != NULL && *p != 0
,你将不会得到一个稍慢的程序,你将得到一个崩溃的程序。
这种短路对于按位运算符几乎没有意义,和比普通的非短路运算符更贵。
答案 2 :(得分:2)
按位运算通常非常便宜,以至于检查会使运算时间延长两倍或更多,而逻辑运算符短路的增益可能非常大。
答案 3 :(得分:2)
如果编译器必须检查&的两个操作数。我想你在任何正常情况下都会慢得多。
答案 4 :(得分:1)
出于同样的原因*
如果第一个操作数为0则不会短路 - 这将是一个不起眼的特殊情况,并且为它添加特殊的运行时测试会使所有乘法变慢。
当操作数不是常量时,短路比不短路更昂贵,所以除非程序员明确要求,否则你不想这样做。所以你真的想要有关于何时发生的简洁规则。