与标题状态一样,是整数(或浮点数等任何数值数据类型)比较运算符(==,!=,>,> =,<,< =)在C ++中短路? / p>
答案 0 :(得分:6)
他们不能短路。要知道x == y
,x != y
等是true
还是false
,您需要同时评估x和y。短路是指逻辑布尔运算符&&
和||
。如果第一个参数为false,则已知逻辑AND为假,如果第一个参数为true,则已知逻辑OR为真。在这些情况下,您不需要评估第二个参数,这称为短路。
编辑:这是关于为什么x >= y
在操作数为无符号整数并且x
为零时不会短路的讨论之后:
对于逻辑操作数,短路是免费的,并且是实现中立的。 if(f() && g()) stmt;
的机器代码可能与此类似:
call f
test return value of f
jump to next on zero
call g
test return value of g
jump to next on zero
execute stmt
next: ...
为了防止短路,你实际上需要计算操作员的结果并在那之后进行测试。这将带您注册并使代码效率降低。
对于非逻辑运算符,情况正好相反。强制短路意味着:
编译器需要添加额外的测试/跳转。对于if(f() > g()) stmt;
,机器代码将如下所示:
call f
mov return value of f to R1
test return value of f
jump to next on zero
call g
compare R1 with return value of g
jump to next on less-than equal
execute stmt
next: ...
注意第一次测试和跳转是如何不必要的。
答案 1 :(得分:1)
没有。比较运算符需要两个操作数来评估正确的答案。相比之下,逻辑运算符&&
和||
在某些情况下不需要评估正确的操作数来获得正确的答案,因此会“短路”。
答案 2 :(得分:1)
1 == 2
是否必须同时检查1和2.(Ofcoruse,编译器可以进行大量重新排序,静态检查,优化等,但这不是继承到c ++)
答案 3 :(得分:1)
那怎么办?短路意味着您可以避免仅根据评估LHS的结果来评估RHS。
e.g。
true || false
不需要评估RHS,因为无论true || x
是什么true
,x
都是5 == x
。
但这不适用于您列出的任何比较。例如:
x
如何在不知道{{1}}的情况下知道表达式的结果?