c ++逻辑表达式优化

时间:2015-01-27 21:25:05

标签: javascript c++ c optimization

我可以用C或C ++或JavaScript或任何其他现代语言来推测,如果我这样做的话......

bool funt1(void) {…}
bool funt2(void) {…}
if (funt1() && funt2()) {Some code}

...我保证会调用这两个函数,或者如果funt1返回false,编译器会对我保释并且永远不会调用funt2吗?

3 个答案:

答案 0 :(得分:3)

在C,C ++和Javascript中,首先评估逻辑运算符&&||短路,即A && BAB评估当且仅当A返回true时。同样,在A || B中,当且仅当B返回false时,才会计算A。这些都由语言标准保证,即使B有副作用,也适用(事实上,这可用于控制这些副作用)。

在C ++中,这些规则仅适用于应用于内置类型的逻辑运算符,但不适用于同名的用户定义逻辑运算符。但是,在您的代码段中,会比较两个bool,因此这不能是用户定义的&&

答案 1 :(得分:2)

C ++中存在一个缺陷:如果第一个和第二个函数返回对象并且逻辑操作都需要它们,则没有短路。

#include <iostream>

struct A {};
struct B {};

bool operator || (const A&, const B&) { return true; }

A a() { std::cout << "A\n"; return A(); }
B b() { std::cout << "B\n"; return B(); }

bool f() { std::cout << "f\n"; return true; }
bool g() { std::cout << "g\n"; return true; }

int main(int argc, char* argv[])
{
    if(a() || b());
    if(f() || g());
}

答案 2 :(得分:1)

你问:

  

我保证会调用这两个函数,或者如果funt1返回false,编译器可以保释我并且永远不会调用funt2吗?

如果funt1()返回false,则可以保证永远不会调用funt2()

如果funt1()返回true,则可以保证funt2()会被调用。