iOS中的布尔
2020-05-05 本文已影响0人
ADreamClusive
我们平时使用的布尔有多种形式:
BOOL、bool、Boolean、Boolean_t
目前,前两种可以说是真正的布尔,后两个是用其他类型表示的伪布尔。
直接上表格,更直观:
Name | Typedef | Header | True Value | False Value |
---|---|---|---|---|
BOOL | signed char / bool | objc.h | YES | NO |
bool | _Bool | stdbool.h | true | false |
Boolean | unsigned char | MacTypes.h | TRUE | FALSE |
boolean_t | int | boolean.h |
下面是分别对各类型详细介绍
BOOL
// objc.h
#if OBJC_BOOL_IS_BOOL
typedef bool BOOL;
#else
# define OBJC_BOOL_IS_CHAR 1
typedef signed char BOOL;
#endif
#if __has_feature(objc_bool)
#define YES __objc_yes
#define NO __objc_no
#else
#define YES ((BOOL)1)
#define NO ((BOOL)0)
#endif
可以近似的理解为在 64-bit 设备上 BOOL 实际是 bool 类型,在 32-bit 设备上 BOOL 的实际类型是 signed char。
关于__objc_yes和__objc_no,可以在LLVM 的文档查看。
__objc_yes 和 __objc_no 其实就是 (BOOL)1 和 (BOOL)0,这么写的原因就是为了消除 BOOL 和整型数的歧义而已。
bool
// stdbool.h
#ifdef __cplusplus
#undef bool
#undef true
#undef false
#undef __bool_true_false_are_defined
#define __bool_true_false_are_defined 1
#endif
#define bool _Bool
#define true 1
#define false 0
可以看到bool、true、false的定义以c++中的定义为准。
Boolean
false/true是标准C++语言里新增的关键字,而FALSE/TRUE是通过#define定义的宏,用来解决程序在C与C++环境中的差异。以下是FALSE/TRUE在windef.h
中的定义:
#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif
换言之,FALSE/TRUE是int类型,而false/true是bool类型,两者是不一样的,只不过C++帮我们完成了相关的隐式转换,以至于我们在使用中没有任何感觉。bool在C++里占用的是1个字节,所以false也只占用1个字节。
目前,苹果的定义是这样的:
Boolean types and values
Boolean Mac OS historic type, sizeof(Boolean)==1
bool Defined in stdbool.h, ISO C/C++ standard type
false Now defined in stdbool.h
true Now defined in stdbool.h
MacOS的一个历史类型,目前应该是以BOOL替代了。
boolean_t
为ARM提供的布尔类型,是指就是int型
Boolean type, for ARM
实例
BOOL a = 3;
NSLog(@"a = %d",a); // a = 1
a = -1;
NSLog(@"a = %d",a); // a = 1
a = 0;
NSLog(@"a = %d",a); // a = 0
bool b = true;
bool c = false;
BOOL d = YES;
BOOL e = NO;
NSLog(@"b = %d",b);
NSLog(@"c = %d",c);
NSLog(@"d = %d",d);
NSLog(@"e = %d",e);
Boolean f = 3;
NSLog(@"f = %d",f); // f = 3
f = FALSE;
NSLog(@"f = %d",f);
boolean_t i = 4;
NSLog(@"i = %d",i); // i = 4
以下是上面代码预编译之后的结果(去掉了NSLog的代码😊):
BOOL a = 3;
a = -1;
a = 0;
_Bool b = 1;
_Bool c = 0;
BOOL d = __objc_yes;
BOOL e = __objc_no;
Boolean f = 3;
f = 0;
boolean_t i = 4;