【问题标题】:confused by C++ logical OR (||) operator [duplicate]被 C++ 逻辑 OR (||) 运算符混淆 [重复]
【发布时间】:2015-12-02 16:38:55
【问题描述】:

假设我在|| 运算符的左/右有两个表达式。我发现如果左表达式为真,则永远不会调用右运算符。例如,在我下面的代码中,当getRand 返回true 时,我发现Foo 永远不会被调用。我在 Mac OSX 上的 XCode 上进行了测试,想知道它是否是我们可以依赖的 C++ 的可靠特性——如果留下 || 的一部分是真的,永远不会调用正确的部分,或者它只是针对特定平台的特殊功能(例如带有 XCode 的 OSX)?在下面发布我的代码,谢谢。

bool Foo()
{
    std::cout << "I am called!\n";
    return false;
}

bool getRand()
{
    int random_variable = std::rand();
    std::cout << random_variable << '\n';

    return random_variable % 2 == 1;
}

int main(int argc, const char * argv[]) {

    if (getRand() || Foo())
    {
        std::cout<<"Hello World \n";
    }

    return 0;
}

提前致谢, 林

【问题讨论】:

  • wondering if it is a reliable feature of C++ we could rely on 是的。
  • && 也有短路评估,如果第一个参数为假
  • 短路评估是一个可靠的功能大部分时间。如果使用的类型具有重载的 && 运算符,它将不起作用。像 bool 这样的原始类型是安全的。

标签: c++


【解决方案1】:

是的,这是一个保证功能,称为short circuit evaluation

同样,表达式 false &amp;&amp; expression 永远不会计算正确的表达式。

【讨论】:

    【解决方案2】:

    想知道它是否是我们可以依赖的 C++ 的可靠特性 -- 如果留下 || 的一部分是真的,正确的部分永远不会被调用?

    是的,对于内置运算符。

    从标准,$5.15/1 逻辑或运算符 [expr.log.or](我粗体)

    ||运算符组从左到右。操作数都是 上下文转换为布尔值(第 4 条)。如果有任何一个,则返回 true 其操作数为真,否则为假。与 |、|| 不同保证 从左到右的评估;此外,第二个操作数不是 如果第一个操作数的计算结果为真,则进行评估

    并注意operator||的重载会失去这个特殊属性。

    Logical operators(我加粗)

    内置运算符 && 和 ||执行短路评估(不要 如果在评估后结果已知,则评估第二个操作数 第一个),但 重载的运算符表现得像常规函数 调用并始终评估两个操作数

    【讨论】:

      【解决方案3】:

      由于它的一个或另一个选择,因此不需要评估第二部分,不依赖于平台是一种语言特性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-05
        • 1970-01-01
        • 2011-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多