Objective-C征途:BOOL Party
1.启动XCode4.3.2,单击菜单项File->New->Project...->选择Mac OS X项目->单击Command Line Tool项目模板->Next->命名项目为BOOLParty->Create,创建项目:
2.单击main.m文件,并添加如下代码:
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值。这里比较简单,就不再详述了!
在这个时候,如果我们添加一个方法:
{
return thing1-thing2;
}
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)
{
.................
}
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)) 改成这种模式,才是正道!