selector

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;
上一篇下一篇

猜你喜欢

热点阅读