在我们编程的过程中,布尔类型是不可或缺的数据类型,我们知道布尔类型一般表现为真值或者假值,但是在不同的编程语言,布尔类型却有不同的表现。让我们来看,C语言:实际上,C语言并不具备布尔类型,但是一般定义0为假值,非0值是真值(一般用1表示),所以int类型与布尔类型可谓难兄难弟,可以互相转换;而在java语言:int类型与布尔类型却是不能互相转换,存储的值只有true或者false值;再看我们的主角Objective-C语言:它具有有的是YES和NO值,这两个值只是一种约定,编译器将BOOL类型认作8位的二进制数,所以Objective-C并不将BOOL作为仅能保存YES或NO值的真正布尔类型来处理,正因为Objective-C这一处理机制,也引发了一些让人苦恼的小问题。先让我们来一段代码,看看BOOL类型的用法: 1.启动XCode4.3.2,单击菜单项File->New->Project...->选择Mac OS X项目->单击Command Line Tool项目模板->Next->命名项目为BOOLParty->Create,创建项目:
2.单击main.m文件,并添加如下代码:
#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[])
{
BOOL areTheyDifferent;
areTheyDifferent = areIntsDifferent(
5,
5);
NSLog(
@" Are %d and %d different? %@ ",
5,
5,boolString(areTheyDifferent));
areTheyDifferent = areIntsDifferent(
23,
42);
NSLog(
@" Are %d and %d different? %@ ",
23,
42,boolString(areTheyDifferent));
return 0;
}
运行,如下输出:
从上面来的输出来看,我们可以利用整形数字,用==符号比较得出YES和NO值。这里比较简单,就不再详述了!
在这个时候,如果我们添加一个方法:
BOOL areIntsDifferent_faulty(
int thing1,
int thing2)
{
return thing1-thing2;
}
同时在main函数里面添加如下代码;
NSLog(
@" %d %d ",YES,NO);
if(areIntsDifferent_faulty(
23,
5)==YES)
{
NSLog(
@" Are %d and %d different? %d YES ",
23,
5,areIntsDifferent_faulty(
23,
5));
}
else {
NSLog(
@" Are %d and %d different? %d NO ",
23,
5,areIntsDifferent_faulty(
23,
5));
}
if(areIntsDifferent_faulty(
23,
5))
{
NSLog(
@" Are %d and %d different? %d YES ",
23,
5,areIntsDifferent_faulty(
23,
5));
}
else {
NSLog(
@" Are %d and %d different? %d NO ",
23,
5,areIntsDifferent_faulty(
23,
5));
}
现在,我们先运行一下,看看现在的BOOLParty输出什么给我们:
好,我们来分析一下。在这之前,我们添加了方法:areIntsDifferent_faulty,利用两个整形数字来相减得出一个整形值,并转换BOOL。由此来看,int与BOOL可以互相转换,真的是这样吗?再看看程序的输出,我把YES值与NO值转换int值输出,得出的是1和0值,这里没有问题。但是我们前后经过areIntsDifferent_faulty方法将两整型值相减得出的BOOL型的整型值却是18?这是为什么呢?正如这边文章的开篇所说,BOOL是被作为一个拥有8位存储空间的数据类型,当然可以存储18而不会失去部分的值!
经过两次的条件判断:
if(areIntsDifferent_faulty(23, 5)==YES)
{
.................
}
if(areIntsDifferent_faulty(23, 5))
{
..................
}
却有有两次不同的结果?显然,第一次输出23与5是相同的,是错误的!这里就是我在开篇时说的那个小小问题了!再详细分析YES与NO的值吧,这次我用二进制来表示:
YES:00000001
NO:00000000
再有,18:00010010
在int 转换成BOOL类型,比较的时候,int类型只有低位用作BOOL类型的比较,18的最低位为0,在编译器看来,18代表的就是一个NO。
绝对不要将BOOL与YES比较: if(areIntsDifferent_faulty(23, 5)==YES) ,也不要 if(areIntsDifferent_faulty(23, 5)==NO),因为==符号,通常是比较两个值的内存地址值。不然的话就会出现一些让人觉得很懊恼的情况,就像23,5是相同的值!悲剧........
if(areIntsDifferent_faulty(23, 5)) 改成这种模式,才是正道!