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比较