&&和&的优化行为

use*_*155 0 c++ optimization logical-operators visual-studio-2012

考虑

 bool Fun1()
{
 ...
}
bool Fun2()
{
}
Run Code Online (Sandbox Code Playgroud)

在我可以拥有的主要代码中的某个地方

if(Fun1() && Fun2()) //option-1
{
}
Run Code Online (Sandbox Code Playgroud)

要么

if(Fun1() & Fun2()) //option-2 
{
}
Run Code Online (Sandbox Code Playgroud)

在VS2012中似乎option-1没有确保在发生这两种功能时始终执行这两项功能option-2.具体来说,如果其中一个函数返回,false则不执行其他函数option-1.但是,整体代码要求对它们的正确行为进行评估,这是我能够实现的option-2.我想知道这种行为是否option-2可以从编译器改为编译器(也有优化级别)或由标准确保?

Ser*_*eyA 5

标准明确表示对于像bool运算符这样的内置类型&&并且||是短路的 - 即,第一个参数首先被计算,而第二个参数仅在第一个参数没有给出语句的确定答案时进行评估 - 即它是falsefor ||truefor &&.

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