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

Tim*_*ddy 17 objective-c

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

BOOL hasValue_:1;

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

- (void) setHasValue:(BOOL) value {
    hasValue_ = !!value;
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

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

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

jus*_*tin 13

我想知道为什么双重感叹号是必要的?

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

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

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

不.这是一个signed char.!!value将输入值减少到YESNO.

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

BOOL不能保证0为假,其他一切都是真的吗?

BOOL是一个signed char.一typedefsigned char不作这样的保证.

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