为了账号安全,请及时绑定邮箱和手机立即绑定

Objective-C:BOOL vs bool

Objective-C:BOOL vs bool

C
慕码人2483693 2019-07-26 11:40:58
Objective-C:BOOL vs bool我看到了“新型” BOOL(YES,NO)。我读到这种类型几乎就像一个字母。为了测试,我做了:NSLog(@"Size of BOOL %d", sizeof(BOOL));NSLog(@"Size of bool %d", sizeof(bool));很高兴看到两个日志都显示“1”(有时在C ++中bool是一个int,其sizeof是4)所以我只是想知道bool类型是否存在某些问题?我可以在不失速度的情况下使用bool(看似有效)吗?
查看完整描述

3 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

如上所述,BOOL是一个签名字符。bool - 来自C99标准(int)的类型。

BOOL - 是/否。bool - 真/假。

见例子:

bool b1 = 2;if (b1) printf("REAL b1 \n");if (b1 != true) printf("NOT REAL b1 \n");BOOL b2 = 2;if (b2) printf("REAL b2 \n");if (b2 != YES) printf("NOT REAL b2 \n");

结果是

REAL b1 
REAL b2 
NOT REAL b2

注意bool!= BOOL。以下结果仅为ONCE AGAIN - REAL b2

b2 = b1;if (b2) printf("ONCE AGAIN - REAL b2 \n");if (b2 != true) printf("ONCE AGAIN - NOT REAL b2 \n");

如果你想将bool转换为BOOL,你应该使用下一个代码

BOOL b22 = b1 ? YES : NO; //and back - bool b11 = b2 ? true : false;

所以,在我们的案例中:

BOOL b22 = b1 ? 2 : NO;if (b22)    printf("ONCE AGAIN MORE - REAL b22 \n");if (b22 != YES) printf("ONCE AGAIN MORE- NOT REAL b22 \n");

那么......我们现在得到了什么?:-)


查看完整回答
反对 回复 2019-07-26
?
MYYA

TA贡献1868条经验 获得超4个赞

在撰写本文时,这是objc.h的最新版本:


/// Type to represent a boolean value.

#if (TARGET_OS_IPHONE && __LP64__)  ||  TARGET_OS_WATCH

#define OBJC_BOOL_IS_BOOL 1

typedef bool BOOL;

#else

#define OBJC_BOOL_IS_CHAR 1

typedef signed char BOOL; 

// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" 

// even if -funsigned-char is used.

#endif

这意味着在64位iOS设备和WatchOS BOOL上完全相同,bool而在所有其他设备(OS X,32位iOS)上,它signed char甚至无法被编译器标志覆盖-funsigned-char


它还意味着此示例代码将在不同平台上以不同方式运行(我自己测试):


int myValue = 256;

BOOL myBool = myValue;

if (myBool) {

    printf("i'm 64-bit iOS");

} else {

    printf("i'm 32-bit iOS");

}

BTW从未分配之类的东西array.count来BOOL的变量,因为可能值的约0.4%将是负面的。


查看完整回答
反对 回复 2019-07-26
  • 3 回答
  • 0 关注
  • 531 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信