2010-11-29 56 views
1

实施例的代码如下:我可以使用&=来阻止函数执行吗?

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

意图是确保如果任何功能返回false,下面的功能不被调用。这个语法是否正确或者我需要做result = result && Operation2();

+3

你的意思是合乎逻辑的“和”,而不是按位? – 2010-11-29 18:46:04

+0

是的,我喜欢。最后加入了额外的`&`。 – djeidot 2010-11-29 18:50:15

+3

既然没有`&& =`操作符,现在的问题是你已经意识到`&=`是按位的,是吗? – 2010-11-29 19:01:55

回答

7

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

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

的功能将被评估左到右直到他们中的一个返回false,然后其余的将不被评估。

1

&做一个按位,所以实际上你试图and所有的答案在一起(如果所有三个操作都成功,则返回true,否则返回false)。这不提供短路评估,如果Operation1()发生故障,则不调用Operation2(),如果Operation2()发生故障,则不调用Operation3()

1

你的方法的问题是,我不相信true必须始终最终成为相同的价值。如果一个操作返回2,例如另一个返回4,那么你就可以得到0或false。即使他们都返回true我不知道标准中有任何特定的保证,他们会有相同的按位模式。实际上,他们可能会......但......?

所以我会坚持使用&&运算符,除非您使用积分并确保opX()始终返回某个值为true而另一个为false,这样操作员才能保证按照您的期望进行操作。

此外,与&你不会短路。

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; 
1

我一般看到这种模式写成:

bool result = true; 
result = result && Operation1(); 
result = result && Operation2(); 
result = result && Operation3(); 
return result; 
相关问题