考虑
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
的这种行为是否可以从编译器改为编译器(也有优化级别)或标准确保?
答案 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;表达式编译器会在所有情况下(在没有副作用的情况下)强制执行对两个参数的求值,以利用并行性。