Objective-C征途:BOOL Party

  在我们编程的过程中,布尔类型是不可或缺的数据类型,我们知道布尔类型一般表现为真值或者假值,但是在不同的编程语言,布尔类型却有不同的表现。让我们来看,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(55);
    
    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(235)==YES)
    {
       NSLog(@"Are %d and %d different? %d YES",23,5,areIntsDifferent_faulty(235));
    }
    else {
        NSLog(@"Are %d and %d different? %d NO",23,5,areIntsDifferent_faulty(235));
    }
    
    if(areIntsDifferent_faulty(235))
    {
        NSLog(@"Are %d and %d different? %d YES",23,5,areIntsDifferent_faulty(235));
    }
    else {
        NSLog(@"Are %d and %d different? %d NO",23,5,areIntsDifferent_faulty(235));
    }
现在,我们先运行一下,看看现在的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)) 改成这种模式,才是正道!

 

posted @ 2012-07-26 23:02  苹果吧  阅读(1388)  评论(0编辑  收藏  举报