这句话中&符号(&)的含义是什么?
if ([_managedObjectContext hasChanges] & ![_managedObjectContext save:&error] ) {
}
我总是在有条件的句子中使用&&,今天突然看到只有&在上面的句子中,这句话中它们有什么区别?
更新 :上面的代码是错误的 ,它只是一个错字,对不起,它应该使用&&,而不是&,看起来像这样:
if ([_managedObjectContext hasChanges] && ![_managedObjectContext save:&error] ) {
}
已经解释了&和&&有什么区别,但是代码实际上是一个bug:
save:将被调用,无论hasChanges是否为true。 这很奇怪 - 当没有变化时,不需要调用save :. 如果在大括号之间实际存在代码,那么如果存在更改并且保存:失败,那么将执行该代码。 如果没有变化,并且保存:由于任何原因失败,则将不会检测到失败。 如果花括号之间没有代码,那么如果保存:将被调用,则根本不需要调用hasChanges。
由于代码的功能是完全不可思议的,并且没有评论为什么代码很奇怪,所以它是一个错误。
一般来说,使用&for逻辑非常可疑。 &应该用于按位和,就像
if ((value & mask) != 0) ...
如果你真的想要一个“逻辑和”并评估两个部分(例如,因为他们有副作用),你会写
BOOL hasChanges = [_managedObjectContext hasChanges];
BOOL saveFailed = ! [_managedObjectContext save:&error];
if (hasChanges && saveFailed) ...
&
是一个按位AND运算符。 不像逻辑&&
,它
在这种特殊情况下,操作员操作所有位的事实并不相关,因为第二个操作数具有!
在它前面。 这是一个逻辑NOT,所以它的结果将是1
或0
。
但是,没有短路是相关的:即使[_managedObjectContext hasChanges]
返回0,也会调用[_managedObjectContext save:&error]
方法。
上一篇: What is the mean of the ampersand symbol(&) in this sentence?