iOS中的布尔

作者: ADreamClusive | 来源:发表于2020-05-05 17:17 被阅读0次

    我们平时使用的布尔有多种形式:
    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;
    

    相关文章

      网友评论

        本文标题:iOS中的布尔

        本文链接:https://www.haomeiwen.com/subject/nitvghtx.html