在Objective-C中,!!代表什么意思?

9

我有这段代码:

- (BOOL)isConnected {
    return !!_sessionKey;
}

_sessionKey是之前定义的变量:

NSString* _sessionKey;

这段代码来自于Facebook Connect for iPhone。

由于我正在通过查看其他人编写的代码学习Objective-C。在isConnection函数中使用的!!对我似乎没有用处,还是我错过了什么?它是做什么的?


对表达式的布尔值进行两次否定。这是一种不良的编码风格,不易阅读。也不是很明确。C程序员经常会做这样的事情。 - uchuugaka
2个回答

17

!!将结果转换为YESNO

!!x是从C语言中借鉴来的习惯用法,该表达式的结果为:

  • x==0 // x为零时,!!x == 0
  • x!=0 // x为非零时,!!x == 1

至少在C语言中,您可以使用任何非零表达式作为满足if()或其他条件控制流的条件的值。但是,有时了解“真值”是由1而不仅仅是“非零”表示更好。

在Objective-C中,YES被定义为1,而不是“非零”。因此,在Objective-C中,这个C语言习惯用法变得更加有用。

另一种表述方式:

  • x==NO时,!!x == NO
  • x!=NO时,!!x == YES

在这种情况下,由于_sessionKey似乎是一个对象,0等同于“nil”。而且,由于它是Objective-C,结果是YES或NO,而不是0或1。如果我在这里挑刺,对不起。 - Benjamin Cox
当然,我已经添加了。Benjamin,请注意这是一个社区维基。请随意添加。 - Heath Hunnicutt
4
到目前为止似乎还没有明确指出的是:!! 不是一个运算符,它只是将 ! 运算符应用两次的结果。 - Nefrubyr

14

它的意思是"非非"。

在这种情况下,第一个!可以解释为"不存在",因此它的意思是如果(sessionKey不存在)。

基本上这是一种简洁的说法。

return (_sessionKey != nil). 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接