什么!!在objective-c语法中意味着什么?

时间:2011-04-08 13:36:03

标签: objective-c

我发现了一些类似于以下内容的代码:

BOOL hasValue_:1;

- (BOOL) hasValue {
    return !!hasValue_;
}

- (void) setHasValue:(BOOL) value {
    hasValue_ = !!value;
}

我想知道为什么需要双惊叹号?我们还没有将BOOL传递给方法并返回BOOL吗? BOOL真的是int的typedef吗?

谢谢!

修改
感谢迄今为止的所有回复。我明白使用!!与其他数据类型有效地执行一些类型转换为布尔结果。但是,在上面的示例中,我已经严格使用BOOL了。

修改
如果我已经使用BOOL,为什么有必要将其标准化为0表示假,1表示真实? BOOL不能保证0为假,对其他一切都是真的吗?

6 个答案:

答案 0 :(得分:13)

  

我想知道为什么需要双重感叹号?

BOOLsigned charchar通过typedef冒充布尔类型。它将很乐意代表[SCHAR_MIN...SCHAR_MAX]范围内的任何整数。双感叹号应用布尔值NOT运算两次,有效地将原始值转换为0或1的int,将值缩小到布尔值范围。

但是有一个转折点:BOOL hasValue_:1;声明了一位的位域表示。它可以代表两个值。不需要return !!hasValue_;。但是,从signed charBOOL)到一位时,需要正确缩小范围。

  

我们还没有将BOOL传递给方法并返回BOOL吗?

不。这是一个signed char!!value会将输入值降低为YESNO

  

如果我已经使用BOOL,为什么有必要将其标准化为0表示假,1表示真实?

     

BOOL是否保证0为假,对其他一切为真?

BOOLsigned chartypedef的{​​{1}}不能保证这一点。

C99(在定位osx或ios时可供您使用多年)具有更有用的布尔类型表示(signed char)。不幸的是,由于历史原因,bool仍然在objc中经常使用。就个人而言,我仅在必要时使用BOOL(例如覆盖)。

答案 1 :(得分:4)

我对目标C并不是100%肯定,但在其他语言中,它是彼此相邻的两个布尔运算符。它通常用于确保将falsy或trusy语句转换为适当的布尔值(例如true或false)。由于目标C来自C,因此很有可能这也是它的用途。

答案 2 :(得分:4)

查看this question,BOOL是signed char的typedef。这意味着它可以具有0或1之外的值(在我熟悉的所有现代系统中,它可以具有从-128到127的值)。它不应该,但我不想指望BOOL始终具有值0或1。

因此,有一种方法可以将其标准化为0或1.在C和我熟悉的派生语言中,!是not运算符,它接受一个值并返回1,如果该值被视为false(在C中,将为数字0或0.0或指针类型的空指针常量),否则为0。 !!仅应用!两次,初始值为0,初始值为1。

答案 3 :(得分:3)

双感叹号是一种将整数转换为BOOL的方法,其中1 (和任何其他值!= 0)为真,0为假。另外,你写的是C而不是Objective-c。您的代码也可以在C ++环境中工作,因为它也是c的衍生物。

答案 4 :(得分:2)

这是!运算符两次应用。运算符否定了它的布尔参数。

那么,两次应用它有什么意义,难道你不会回到你开始的地方吗?不一定,因为参数的类型可以是任何类型。这意味着您可以使用整数i,并通过!!i检查它是否为非零。此外,这通常用于检查指针是否为非NULL,例如:

bool doTrace = !!getenv("MY_TEST_VAR");

答案 5 :(得分:2)

  

...它的一些方言,如C99和Objective-C,将布尔类型的标准定义作为int的同义词,将“false”和“true”的宏分别作为0和1。

Wikipedia - Boolean data type

我认为双重否定确保“true”的值为1(可能在算术运算中使用它)。