Objective-C学习笔记--布尔类型

1. 布尔类型:存储真值和假值的变量

2. C语言拥有布尔数据类型bool,它具有true值和false值,Objective-C提供了类似的类型BOOL,它具有YES只和NO值。

3. Objective-C的BOOL类型比C语言的bool类型早诞生十多年,这两种不同的布尔类型可以在同一个程序中共存,但在编写Cocoa代码时要使用BOOL

BOOL陷阱

4. Objective-C中的BOOL实际上是一种对带符号的字符类型(signed char)的定义(typedef),它使用8位存储空间爱你,YES定义为1,NO定义为0(使用#define)

Objective-C并不将BOOL作为仅能保存YES或NO值的真正的布尔类型来处理。编译器将BOOL认作8位二进制数,YES和NO值只是一种约定。这引发了一个小问题,如果不小心讲一个长于1字节的整型值(例如short或int值)赋给一个BOOL变量,那么只有低位字节会用做BOOL值,假设该低位字节刚好为0,BOOL值将会是0,即NO值

例子:

#import <Foundation/Foundation.h>

BOOL areIntsDifferent(int thing1,int thing2){
    if(thing1==thing2){
        return (NO);
    }else{
        return (YES);
    }
}

NSString * boolString(BOOL yesNo){
    if(yesNo==NO)
    {
        return (@"NO");
    }else{
        return (@"YES");
    }
}

int main (int argc, const char * argv[])
{
    NSLog(@"are %d and %d different? %@",5,5,boolString(areIntsDifferent(5, 5)));//are 5 and 5 different? NO
    
    NSLog(@"are %d and %d different? %@",23,42,boolString(areIntsDifferent(23, 42)));//are 5 and 5 different? NO
    
    return (0);
}

这样不会得到布尔值:

经验丰富的C语言程序员或许会试着将areIntsDifferent()函数携程一条语句

BOOL areIntsDifferent_faulty(int thing1,int thing2){

      return (thing1-thing2);

}

他们之所以这样操作,是因为假定了非零值等于YES,但事实并非如此

if(areIntsDifferent_faulty(23,5)==YES ){}

因为23减5等于18,尽管上述函数在C语言中会得到真值,但是在Objective-C中1不等于YES

**绝不要直接将BOOL值和YES比较,聪明过头的程序员有时会使用类似areIntsDifferent_faulty的函数

相反,将上述if语句改成如下所示if(areIntsDifferent_faulty(5,23)==YES ){}

直接和NO比较则一定安全,因为C 预言中的假值就是0  (此处不明白)

**常见的错误发生在把数组大小,指针的值或者逻辑位运算的结果赋值到BOOL型中,把整形转为BOOL型的时候使用ternery操作符,保证返回YES或NO值

**在BOOL  _BOOL及bool之间可以安全的交换值或转型,但BOOL和Boolean之间不可,所以对待Boolean就像上面讲的整形一样就可以了。在Objective-C函数签名里仅使用BOOL

**对BOOL值使用逻辑运算(&&,||,!)都是有效的,返回值也可以安全的转为BOOL而不需要ternery操作符

**不要把BOOL型变量直接与YES比较

原文地址:https://www.cnblogs.com/cc-Cheng/p/3312661.html