博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Objective-C征途:BOOL Party
阅读量:6292 次
发布时间:2019-06-22

本文共 2544 字,大约阅读时间需要 8 分钟。

  在我们编程的过程中,布尔类型是不可或缺的数据类型,我们知道布尔类型一般表现为真值或者假值,但是在不同的编程语言,布尔类型却有不同的表现。让我们来看,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)) 改成这种模式,才是正道!

 

转载地址:http://nsdta.baihongyu.com/

你可能感兴趣的文章
mysql 时间函数 时间戳转为日期
查看>>
索引失效 ORA-01502
查看>>
Oracle取月份,不带前面的0
查看>>
Linux Network Device Name issue
查看>>
IP地址的划分实例解答
查看>>
如何查看Linux命令源码
查看>>
运维基础命令
查看>>
入门到进阶React
查看>>
SVN 命令笔记
查看>>
检验手机号码
查看>>
重叠(Overlapped)IO模型
查看>>
Git使用教程
查看>>
使用shell脚本自动监控后台进程,并能自动重启
查看>>
Flex&Bison手册
查看>>
solrCloud+tomcat+zookeeper集群配置
查看>>
/etc/fstab,/etc/mtab,和 /proc/mounts
查看>>
Apache kafka 简介
查看>>
socket通信Demo
查看>>
技术人员的焦虑
查看>>
js 判断整数
查看>>