当前位置:  开发笔记 > 编程语言 > 正文

被C++逻辑OR(||)运算符搞糊涂了

如何解决《被C++逻辑OR(||)运算符搞糊涂了》经验,为你挑选了2个好方法。

假设我有两个表达式左/右的||运算符.我发现如果左表达式为真,则永远不会调用右运算符.例如,在我的下面的代码中,当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;
}

林先生,提前谢谢



1> wallyk..:

是的,它是一种称为短路评估的保证功能.

同样,表达式 false && expression 永远不会评估正确的表达式.



2> songyuanyao..:

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

是的,对于内置运营商.

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

|| 操作员组从左到右.操作数都在上下文中转换为bool(第4条).如果其任一操作数为true,则返回true,否则返回false.与|,||不同 保证从左到右的评估; 此外,如果第一个操作数的计算结果为true,则不计算第二个操作数.

请注意,超载operator||将失去这个特殊属性.

逻辑运算符(由我粗体)

内置运营商&&和|| 执行短路评估(如果在评估第一个操作数后,如果结果已知,则不评估第二个操作数),但是重载操作符的行为类似于常规函数调用,并且总是评估两个操作数.

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有