我可以使用& =来阻止函数执行吗?

时间:2010-11-29 18:44:20

标签: c++ operators

示例代码如下:

bool result;
result = Operation1();
result &= Operation2();
result &= Operation3();
return result;

目的是确保,如果任何函数返回false,则不调用后面的函数。这种语法是正确的还是我需要result = result && Operation2();

5 个答案:

答案 0 :(得分:7)

如果你的意思是逻辑“和”而不是按位(我怀疑是这样,因为你使用bool),使用短路:

result = Operation1() && Operation2() && Operation3();

将从左到右评估函数,直到其中一个函数返回false,然后其余函数将不会被评估。

答案 1 :(得分:2)

代码的短路版本(当你立即返回时不需要结果变量):

if (!Operation1()) return false;
if (!Operation2()) return false;
return Operation3();

或者,如果表达式实际上与此示例中的表达式一样短:

return Operation1() && Operation2() && Operation3();

如果示例代码不具代表性,并且您需要变量用于某些未说明的原因:

bool result = Operation1();
if (result) result = Operation2();
if (result) result = Operation3();
return result;

答案 2 :(得分:1)

&做了一点点,所以实际上你正在尝试and所有的答案(如果所有三个操作都成功,则为true,否则为false)。如果Operation2()失败,则Operation1()未调用,而Operation3()失败则未调用Operation2(),这不会提供短路评估。

答案 3 :(得分:1)

您的方法存在的问题是我不相信true必须总是最终成为相同的值。例如,如果一个操作符返回2,则返回另外4个,并且您和那些你得到0或false。即使它们都返回true,我也不知道标准中有任何特定的保证,它们将具有相同的按位模式。实际上,他们可能会......但是......?

所以我坚持使用&&运算符,除非您使用积分并确保opX()始终返回true的某个值而另一个返回false,以保证&=运算符做你期望的事。

此外,使用&,您不会发生短路。

答案 4 :(得分:1)

我通常认为这种模式写成:

bool result = true;
result = result && Operation1();
result = result && Operation2();
result = result && Operation3();
return result;