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中的布尔

    我们平时使用的布尔有多种形式:BOOL、bool、Boolean、Boolean_t 目前,前两种可以说是真正的布...

  • 5章 布尔表达式

    本章大纲 布尔类型 布尔表达式 布尔操作符 布尔类型 布尔类型:只有2中结果:真 假 布尔表达式 布尔表达式 ...

  • iOS 常用到的知识点(二)

    iOS 常用到的知识点(一)iOS 常用到的知识点(二)iOS 常用到的知识点(三) 1.延迟加载: 2.布尔值存...

  • python中的语法规则(二)

    python中布尔值(bool) 和Java语言中的布尔类型一样,python中布尔类型同样是用来做逻辑判断,有T...

  • typeScript学习01

    布尔类型 布尔值是最基础的数据类型,在 TypeScript 中,使用 boolean 定义布尔值类型: 数值类型...

  • Python中的布尔类型

    Python中的布尔类型只有True和False两种值其中Python把0、空字符串''和None看成 False...

  • dart中的布尔常量

    为了代表布尔值,Dart 有一个名字为bool的类型。 只有两个对象是布尔类型的:true和false所创建的对象...

  • 2.6 布尔求值

    Groovy 中的布尔求值与 Java 中不同。在 Java 中,if 语句的条件部分必须是一个布尔表达式,比如 ...

  • php04—数据类型4-布尔值、数组、对象、特殊数据类型Reso

    1.布尔值 什么是布尔值 布尔类型就是真(true)和假(false); 注:在php中布尔值不区分大小写,tru...

  • Python中布尔类型

    与运算:只有两个布尔值都为 True 时,计算结果才为 True。 或运算:只要有一个布尔值为 True,计算结果...

网友评论

    本文标题:iOS中的布尔

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