考虑一下
bool Fun1()
{
...
}
bool Fun2()
{
}在主代码中的某个地方我可以
if(Fun1() && Fun2()) //option-1
{
}或
if(Fun1() & Fun2()) //option-2
{
}似乎在VS2012中,在option-1中,并不能确保在option-2上同时执行这两个函数。具体地说,如果其中一个函数返回false,则不会使用option-1执行其他函数。但是,总体代码需要对它们进行适当的行为评估,我可以使用option-2来实现这一点。我想知道option-2的这种行为是否可以在不同的编译器之间改变(也有优化级别),或者是由标准保证的?
发布于 2016-09-01 22:37:35
Standard明确指出,对于像bool运算符这样的内置类型,&&和||是短路的-也就是说,首先计算第一个参数,然后只有当第一个参数没有给出语句的明确答案时才计算第二个参数-即,对于||,它是false,对于&&,它是true。
逐位&遵循正常的函数调用规则,因此这两个参数都以未指定的顺序进行计算。
发布于 2016-09-01 22:45:06
Bitwise-&实际上总是同时计算两个操作数。由于as-if规则,编译器无法将其优化。但是像这样的编程是一种代码的味道。考虑一下维护你的代码的人。为什么只有一个&而不是两个?是打字错误吗?等。
我至少会从if语句中删除计算结果。
bool fun12 = Fun1() & Fun2();
if (fun12) {
. . .此外,您不能将这种方法扩展到非bool函数。您必须首先与0进行比较。
最后,&&计算第一个操作数,然后(可选)计算第二个操作数。&中的评估顺序是未指定的(即随机)。
发布于 2016-09-01 22:44:05
&&具有短路行为,换句话说,如果第一个操作数为false,则不计算第二个操作数。&没有这种行为,所以第二个总是被确定地计算出来。但是,如果您正在处理布尔值,请始终使用&&而不是&,因为&用于逐位操作。对于您的问题,请使用以下代码:
bool a = Fun1();
if(Fun2() && a){
//Fun2 must be the left operand
}https://stackoverflow.com/questions/39274289
复制相似问题