2016-03-27 84 views
1

我有一个简单的问题来优化我的代码。如何工作if()语句

bool myfunc(); 

if (false && true && myfunc()) 
{ 
} 

函数myfunc()被调用?

+3

总之:不,它不会被调用。 –

+0

否。if条件将在第一个错误时停止,而不会测试其他两个条件。 – Drakes

+0

伙计们。答案在_ANSWER部分_ –

回答

4

&&||具有短路评价,即,一旦该结果明确知道(false&&true||)评价停止。它总是严格从左到右。

在这种情况下,编译器甚至可能会选择完全消除if语句,因为编译时的条件已知为false,因此代码之后无法访问。

+0

非常感谢您的帮助 – harut9

+5

准确地说,只有内置的逻辑表达式具有短路语义。当运算符被重载时,表达式是一个正常的函数调用。 –

8

因为C++有short-circuit evaluation的条件,所以不会调用该函数,因为第一个false无论如何都会使整个表达式为false。

如果你改变顺序,所以你先把函数调用(即myfunc() && false && true),那么函数将被调用。尽管如此,表达式的结果仍然是false,无论myfunc返回什么结果。

+0

如果你在你的答案中写下订单,那么编译器是不是会优化整个if语句和其范围内的所有内容?或者在那里有异常的情况下调用该函数? – Chiel

+2

@Chiel如果函数是来自另一个翻译单元的外部函数,那么编译器无法知道它做了什么,或者它有什么副作用,所以函数调用不能被优化。它可以优化的是它除了呼叫外没有其他任何操作,而忽略返回的值。 –

1

不,myfunc()将不会被调用,因为第一个false,编译器将停在那里。这就是所谓的短路评估。