这句话中&符号(&)的含义是什么?

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,所以它的结果将是10

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

    链接地址: http://www.djcxy.com/p/72653.html

    上一篇: What is the mean of the ampersand symbol(&) in this sentence?

    下一篇: What does &= mean in objective c?