繁体   English   中英

布尔的C ++短路

[英]C++ short-circuiting of booleans

我是C ++的新手,并且很好奇编译器如何处理布尔值的惰性计算。 例如,

if(A == 1 || B == 2){...}

如果A等于1,是否曾经评估过B == 2部分?

不,不评估B==2部分。 这称为短路评估

编辑:正如Robert C. Cartaino正确指出的那样 ,如果逻辑运算符超载,则不会进行短路评估(话虽如此,为什么有人会使逻辑运算符超载不在我的范围内)。

除非|| 运算符已重载 ,将不对第二个表达式求值。 这称为“短路评估”。

在逻辑AND(&&)和逻辑OR(||)的情况下,如果第一个表达式足以确定整个表达式的值,则不会对第二个表达式求值。

在上述情况下:

if(A == 1 || B == 2) {...}

...第二个表达式将不被评估,因为

TRUE || ANYTHING TRUE || ANYTHING ,始终求值为TRUE

同样

FALSE && ANYTHING始终评估为FALSE ,因此这种情况也会引起短路评估

几个快速笔记

  • 短路评估不适用于过载的&&|| 操作员。
  • 在C ++中,可以保证第一个表达式将首先被求值。 某些语言不保证评估顺序,VB根本不进行短路评估。 知道是否要移植代码很重要。

B == 2部分未评估。

小心! 不要在那边放++ B == 2之类的东西!

C ++对布尔表达式求值应用了短路 ,因此,永远不会求值B == 2 ,并且编译器甚至可能完全忽略它。

编译器通过生成中间跳转来处理此问题。 对于以下代码:

if(A == 1 || B == 2){...}

编译为伪汇编器,可能是:

    load variable A
    compare to constant 1
    if equal, jump to L1
    load variable B
    compare to constant 2
    if not equal, jump to L2
L1:
    ... (complete body of if statement)
L2:
    (code after if block goes here)

正如James所说,这是短路评估 惰性评估是完全不同的东西。

不,这不对。

&&相同,如果其中一个错误,则不必理会另一个。

B == 2永远不会评估。

有关更多信息,请参见短路评估

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM