C++逻辑或(||)运算符让我困惑了

9
假设我有两个表达式在“||”运算符的左/右。如果左侧表达式为true,则右侧运算符将永远不会被调用。例如,在我的下面的代码中,当“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;
}

感谢您的提前帮助,Lin。

2
“想知道它是否是我们可以依赖的C++可靠特性。” “是的,它是。” - Matt
2
&&也具有短路评估,如果第一个参数为false。 - sp2danny
2
短路求值是一个可靠的特性,大多数情况下都可以使用。但如果所使用的类型具有重载的 && 运算符,则无法正常工作。像 bool 这样的原始类型是安全的。 - kolrabi
3个回答

10

是的,这是一种被称为短路求值的保证特性。

同样地,表达式false && expression将永远不会评估右侧的表达式。


8

想知道C++中我们可以依赖的可靠特性 - 如果||的左侧为真,则不会调用右侧吗?

是的,对于内置运算符。

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

||运算符从左到右分组。操作数都被上下文转换为bool型(第4节)。如果它的任一操作数为true,则返回true;否则返回false。与|不同,||保证从左到右进行求值;此外,如果第一个操作数计算结果为true,则不会计算第二个操作数

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

逻辑运算符 (我加粗)

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


1
由于只有两个选择,因此无需评估第二部分,它不依赖于平台,是一种语言特性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接