【问题标题】:How does C++ handle &&? (Short-circuit evaluation) [duplicate]C++如何处理&&? (短路评估)[重复]
【发布时间】:2023-03-10 14:43:02
【问题描述】:

当遇到 (bool1 && bool2) 时,c++ 是否会尝试检查 bool2 是否发现 bool1 为假,还是像 PHP 那样忽略它?

对不起,如果这个问题太基本了,但我真的在 Schildt 和 Internet 上都找不到提及。

【问题讨论】:

    标签: c++ short-circuiting and-operator logical-and


    【解决方案1】:

    是的,C++ 中的&& 运算符使用short-circuit evaluation,因此如果bool1 计算结果为false,它就不会计算bool2

    “短路评估”是您想在 Google 上搜索并在索引中查找的花哨术语。

    || 运算符也会发生同样的情况,如果 bool1 计算结果为 true,则整个表达式将计算结果为 true,而不计算 bool2

    如果您想计算所有表达式,您可以使用&| 运算符。

    【讨论】:

    • 用 or || 进行短路评估怎么样
    • || 运算符也使用短路评估。不同之处在于,给定表达式bool1 || bool2,当bool1 计算为false 时,bool2 也将被计算。
    • > "如果你想计算所有表达式,你可以使用 & 和 | 运算符。" 用位运算符 & 和 | 替换逻辑 && 和 ||除非您严格使用 bool 表达式,否则不安全。由于逻辑运算符可以作用于其他类型,因此不能保证您获得可靠的结果。例如:4 && 2 的计算结果为 true,而 4 & 2 的计算结果为 04 || 2 的计算结果为 true,而 4 | 2 的计算结果为 6。如果您想强制计算两个表达式并进行逻辑比较,请显式评估,然后进行比较。
    【解决方案2】:

    C++ 确实使用短路逻辑,所以如果bool1 为假,则不需要检查bool2

    如果 bool2 实际上是一个返回 bool 的函数,或者使用指针,这很有用:

    if ( pointer && pointer->someMethod() )
    

    如果没有短路逻辑,它会在取消引用 NULL 指针时崩溃,但使用短路逻辑,它可以正常工作。

    【讨论】:

    • 你能确定pointer 会在pointer->someMethod() 之前被评估吗?
    【解决方案3】:

    这是正确的(短路行为)。但请注意:如果调用的运算符不是内置运算符,而是用户定义的operator&&(与operator|| 相同),则短路停止。

    Reference in this SO

    【讨论】:

    • 但短路绝不限于本机类型。重载转换为 bool(或安全 bool)而不是 operator && 使这项工作正常。
    • 有趣。我不知道。你知道定义这个的标准中的部分/文本吗?
    • 没错,reference in this SO。我会尝试改写我的答案。
    【解决方案4】:

    C++ 中的 && 运算符短路 - 如果在您的示例中 bool1 为 false,则不会检查/执行 bool2

    【讨论】:

      【解决方案5】:

      这称为短路评估(Wikipedia)

      && 运算符是 C++ 中的短路运算符,如果 bool1 为假,它将不会计算 bool2。

      【讨论】:

        【解决方案6】:

        短路评估表示某些编程语言中某些布尔运算符的语义,其中第二个参数仅在第一个参数不足以确定表达式的值时才执行或评估:例如,当第一个参数AND 函数的计算结果为假,整体值必须为假;并且当 OR 函数的第一个参数的计算结果为 true 时,整体值必须为 true。

        在 C++ 中,&& 和 ||运算符使用短路评估。

        【讨论】:

          【解决方案7】:

          您指的是short circuit evaluation。我认为它可能是特定于编译器的,但是我链接到的那篇文章显示它是特定于语言的,并且 C++ 确实遵守。如果它确实是特定于编译器的,我无法想象一个不会遵循它的编译器。我目前使用的日常编译器 VS 2008 可以。基本上它会遵循运算符优先级,只要条件结果得到保证,

          【讨论】:

            猜你喜欢
            • 2012-02-10
            • 2015-09-12
            • 2021-11-21
            • 2017-09-10
            • 2011-04-07
            • 1970-01-01
            相关资源
            最近更新 更多