整数比较运算符是否在C ++中短路?

时间:2011-01-13 19:50:19

标签: c++ comparison short-circuiting

与标题状态一样,是整数(或浮点数等任何数值数据类型)比较运算符(==,!=,>,> =,<,< =)在C ++中短路? / p>

4 个答案:

答案 0 :(得分:6)

他们不能短路。要知道x == yx != 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是什么truex都是5 == x

但这不适用于您列出的任何比较。例如:

x

如何在不知道{{1}}的情况下知道表达式的结果?