困惑的C ++逻辑OR(||)运算符

时间:2015-12-02 08:20:49

标签: c++

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

3 个答案:

答案 0 :(得分:10)

是的,这是一项名为short circuit evaluation的保证功能。

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

答案 1 :(得分:8)

  

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

是的,对于内置运营商。

来自标准的$ 5.15 / 1逻辑OR运算符[expr.log.or](由我粗体显示)

  

||操作员组从左到右。操作数都是   在上下文中转换为bool(第4条)。如果有的话,它返回true   它的操作数是真的,否则是假的。与|,||不同担保   从左到右的评价;而且,第二个操作数不是   评估第一个操作数是否为真

请注意operator||的重载将失去此特殊属性。

Logical operators(我粗体)

  

内置运营商&amp;&amp;和||进行短路评估(不要   如果在评估后知道结果,则评估第二个操作数   第一个),但重载运算符的行为类似于常规函数   调用并始终评估两个操作数

答案 2 :(得分:1)

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