我可以用C或C ++或JavaScript或任何其他现代语言来推测,如果我这样做的话......
bool funt1(void) {…}
bool funt2(void) {…}
if (funt1() && funt2()) {Some code}
...我保证会调用这两个函数,或者如果funt1
返回false,编译器会对我保释并且永远不会调用funt2
吗?
答案 0 :(得分:3)
在C,C ++和Javascript中,首先评估逻辑运算符&&
和||
短路,即A && B
,A
和B
评估当且仅当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()
会被调用。