优化行为与&&和&

时间:2016-09-01 14:28:36

标签: c++ visual-studio-2012 optimization logical-operators

考虑

beforeEach(module('myapp.email')); 

在主代码的某处我可以拥有

 bool Fun1()
{
 ...
}
bool Fun2()
{
}

if(Fun1() && Fun2()) //option-1
{
}

在VS2012中,if(Fun1() & Fun2()) //option-2 { } 似乎无法确保在option-1上发生这两种功能时始终执行这两项功能。具体来说,如果其中一个函数返回option-2,那么其他函数不会与false一起执行。但是,整体代码需要评估它们的正确行为,我可以使用option-1来实现。我想知道option-2的这种行为是否可以从编译器改为编译器(也有优化级别)或标准确保?

5 个答案:

答案 0 :(得分:5)

标准明确指出,对于bool等内置类型,运算符&&||被短路 - 即,首先评估第一个参数,然后评估第二个参数只有当第一个论点没有给出声明的明确答案时 - 即false||true&&

按位&遵循正常的函数调用规则,因此,两个参数都以未指定的顺序进行计算。

答案 1 :(得分:2)

按位 - &将始终评估两个操作数。由于 as-if 规则,编译器无法对其进行优化。但是像这样编程是代码气味。想想那些维护代码的人。为什么有一个&而不是两个?这是一个错字吗?等

至少将评估从if语句中拉出来。

  bool fun12 = Fun1() & Fun2();
  if (fun12) {
    . . .

此外,您无法将此方法扩展到非bool函数。您必须先与0进行比较。

最后,&&评估第一个操作数,然后(可选)评估第二个操作数。 &中的评估顺序未指定(即随机)。

答案 2 :(得分:1)

&安培;&安培;具有短路行为,换句话说,如果第一个操作数为假,则不评估第二个操作数。 &安培;没有这种行为,所以第二次总是被评估肯定。但是,如果您正在处理布尔值,请始终使用&&不是&,因为&用于按位运算。对于您的问题,请使用以下代码:

bool a = Fun1();
if(Fun2() && a){
    //Fun2 must be the left operand
}

答案 3 :(得分:0)

如果你想同时运行这两个功能,你可以使用选项-2,但没有必要调用这两个功能,你可以使用选项-1。

<强>行为 option-1和option-2的行为不依赖于编译器。

效果选项-1的效果优于选项-2

答案 4 :(得分:0)

这不是优化问题,而是语义问题。

&安培;&安培;遵循短路评估规则,当第一个返回false时,不得执行第二次调用。

&安培;遵循普通评估,必须执行两个调用(除非它可以证明没有副作用)。

无论如何,人们可以想到一个&amp;&amp; amp;&amp;表达式编译器会在所有情况下(在没有副作用的情况下)强制执行对两个参数的求值,以利用并行性。