这句话中&符号(&)的平均值是多少?

时间:2014-06-25 15:38:11

标签: objective-c conditional-statements ampersand

if ([_managedObjectContext hasChanges] & ![_managedObjectContext save:&error] ) {
}

我总是使用&&在条件句中,今天突然看到只有&在上面的句子中,他们在这句话中有什么区别?

更新:上面的代码错误,这只是一个错字,抱歉,它应该使用&amp;&amp;,not&amp;,看起来像这样:< / p>

if ([_managedObjectContext hasChanges] && ![_managedObjectContext save:&error] ) {
}

2 个答案:

答案 0 :(得分:4)

&是一个按位AND运算符。与逻辑&&不同,它是

  • 根据两个操作数的所有位生成值,
  • 不会使评估短路。

在这种特殊情况下,运算符对所有位进行操作的事实是不相关的,因为第二个操作数在它前面有!。这是一个逻辑NOT,因此其结果将是10

然而,没有短路是相关的:即使[_managedObjectContext save:&error]返回零,也会调用[_managedObjectContext hasChanges]方法。

答案 1 :(得分:1)

已经解释了&amp;和?之间的区别。和&amp;&amp;,但代码实际上是一个错误:

save:将被调用,无论hasChanges是否为真。这很奇怪 - 当没有变化时,就没有必要调用save:如果大括号之间实际存在代码,则在有更改时执行该代码并保存:失败。如果没有更改,并且save:由于任何原因失败,则不会检测到失败。如果大括号之间没有代码,那么如果保存:无论如何都不需要调用hasChanges。

由于代码的作用非常奇怪,并且没有注释为什么代码很奇怪,这是一个错误。

一般来说,使用&amp;逻辑是非常可疑的。 &安培;应该用于按位,和

一样
if ((value & mask) != 0) ...

如果你真的想要一个“逻辑和”并评估两半(例如因为它们有副作用),你会写

BOOL hasChanges = [_managedObjectContext hasChanges];
BOOL saveFailed = ! [_managedObjectContext save:&error];

if (hasChanges && saveFailed) ...