在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
1.启动XCode4.3.2,单击菜单项File->New->Project...->选择Mac OS X项目->单击Command Line Tool项目模板->Next->命名项目为BOOLParty->Create,创建项目:
#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; } 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)); } 好,我们来分析一下。在这之前,我们添加了方法:areIntsDifferent_faulty,利用两个整形数字来相减得出一个整形值,并转换BOOL。由此来看,int与BOOL可以互相转换,真的是这样吗?再看看程序的输出,我把YES值与NO值转换int值输出,得出的是1和0值,这里没有问题。但是我们前后经过areIntsDifferent_faulty方法将两整型值相减得出的BOOL型的整型值却是18?这是为什么呢?正如这边文章的开篇所说,BOOL是被作为一个拥有8位存储空间的数据类型,当然可以存储18而不会失去部分的值! 经过两次的条件判断: if(areIntsDifferent_faulty(23, 5)==YES) 却有有两次不同的结果?显然,第一次输出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)) 改成这种模式,才是正道!
|
请发表评论