if ([_managedObjectContext hasChanges] & ![_managedObjectContext save:&error] ) {
}
我总是使用&&在条件句中,今天突然看到只有&在上面的句子中,他们在这句话中有什么区别?
更新:上面的代码错误,这只是一个错字,抱歉,它应该使用&amp;&amp;,not&amp;,看起来像这样:< / p>
if ([_managedObjectContext hasChanges] && ![_managedObjectContext save:&error] ) {
}
答案 0 :(得分:4)
&
是一个按位AND运算符。与逻辑&&
不同,它是
在这种特殊情况下,运算符对所有位进行操作的事实是不相关的,因为第二个操作数在它前面有!
。这是一个逻辑NOT,因此其结果将是1
或0
。
然而,没有短路是相关的:即使[_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) ...