1

有人告诉我,Objective-C 中的 BOOL 是无符号字符的 typedef,而 YES 和 NO 关键字是编码字符。这不是我第一次听到。我读过这是因为苹果在 C 标准提供 _Bool 类型之前使用了 BOOL,我错了吗?这个事实有什么好处吗?我们在浪费内存吗?这是否提供了一种在函数中返回有价值数据的方法?当发生某些意外行为时,将其用作返回不同值的方法是否正确?

BOOL myFunction(int argument)
{
    BOOL result = YES; //The function generates the result
    if (someError == YES) {
        return 5;
    }
    return result;
}
4

3 回答 3

5

我们在浪费内存吗?

不,因为你不能得到一个小于 a 的变量char:它总是一个字节。您可以将表示布尔标志的多个位打包在一个单词中,但您必须手动进行 - 使用位移位、使用位字段等。

这是否提供了一种在函数中返回有价值数据的方法?

不是真的:你所做的是一个黑客,虽然5肯定会通过系统到达调用者,并且会被解释为YES“普通”if语句,例如

if (myFunction(123)) {
    ...
}

但是,如果像这样使用它会惨遭失败:

if (myFunction(123) == YES) { // 5 != YES
    ...
}

当发生某些意外行为时,将其用作返回不同值的方法是否正确?

从可读性的角度来看,它总是不正确的;至于“做你想做的事”,你的里程可能会有所不同,这取决于你使用你的功能的方式。

于 2013-01-14T22:01:11.837 回答
1

有一点优势:在很多平台(包括iOS、IIRC)上,sizeof(_Bool) == sizeof(int)使用char起来会稍微紧凑一些。

除了BOOLis 实际上signed char,不是char,这@encode(BOOL)在所有平台上对同一事物的评估都是如此。这会使位域稍微复杂化,因为BOOL foo:1;似乎定义了一个 1 位有符号整数(IIRC,其行为未定义)——显然unsigned char是更好的选择,但可能为时已晚。

_Bool还应该更好地优化,因为编译器可以对使用的位模式做出假设,例如替换a&&ba&b(前提b是没有副作用)。一些架构还将“真”表示为所有位集,这对于屏蔽很有用(想到 SSE 比较指令)。

于 2013-01-14T22:16:43.987 回答
0

“Objective-C 中的 BOOL”不是无符号字符,它是 Objective-C 库定义的任何内容。哪个是 unsigned char 或 bool,取决于您的编译器设置(32 位或 64 位)。两者的行为不同。使用 32 位编译器和 64 位编译器尝试此代码:

BOOL b = 256;
if (b) NSLog (@"b is true"); else NSLog (@"b is false");
于 2016-12-20T09:31:35.300 回答