zoukankan      html  css  js  c++  java
  • Objective-C学习笔记--布尔类型

    1. 布尔类型:存储真值和假值的变量

    2. C语言拥有布尔数据类型bool,它具有true值和false值,Objective-C提供了类似的类型BOOL,它具有YES只和NO值。

    3. Objective-C的BOOL类型比C语言的bool类型早诞生十多年,这两种不同的布尔类型可以在同一个程序中共存,但在编写Cocoa代码时要使用BOOL

    BOOL陷阱

    4. Objective-C中的BOOL实际上是一种对带符号的字符类型(signed char)的定义(typedef),它使用8位存储空间爱你,YES定义为1,NO定义为0(使用#define)

    Objective-C并不将BOOL作为仅能保存YES或NO值的真正的布尔类型来处理。编译器将BOOL认作8位二进制数,YES和NO值只是一种约定。这引发了一个小问题,如果不小心讲一个长于1字节的整型值(例如short或int值)赋给一个BOOL变量,那么只有低位字节会用做BOOL值,假设该低位字节刚好为0,BOOL值将会是0,即NO值

    例子:

    #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[])
    {
        NSLog(@"are %d and %d different? %@",5,5,boolString(areIntsDifferent(5, 5)));//are 5 and 5 different? NO
        
        NSLog(@"are %d and %d different? %@",23,42,boolString(areIntsDifferent(23, 42)));//are 5 and 5 different? NO
        
        return (0);
    }

    这样不会得到布尔值:

    经验丰富的C语言程序员或许会试着将areIntsDifferent()函数携程一条语句

    BOOL areIntsDifferent_faulty(int thing1,int thing2){

          return (thing1-thing2);

    }

    他们之所以这样操作,是因为假定了非零值等于YES,但事实并非如此

    if(areIntsDifferent_faulty(23,5)==YES ){}

    因为23减5等于18,尽管上述函数在C语言中会得到真值,但是在Objective-C中1不等于YES

    **绝不要直接将BOOL值和YES比较,聪明过头的程序员有时会使用类似areIntsDifferent_faulty的函数

    相反,将上述if语句改成如下所示if(areIntsDifferent_faulty(5,23)==YES ){}

    直接和NO比较则一定安全,因为C 预言中的假值就是0  (此处不明白)

    **常见的错误发生在把数组大小,指针的值或者逻辑位运算的结果赋值到BOOL型中,把整形转为BOOL型的时候使用ternery操作符,保证返回YES或NO值

    **在BOOL  _BOOL及bool之间可以安全的交换值或转型,但BOOL和Boolean之间不可,所以对待Boolean就像上面讲的整形一样就可以了。在Objective-C函数签名里仅使用BOOL

    **对BOOL值使用逻辑运算(&&,||,!)都是有效的,返回值也可以安全的转为BOOL而不需要ternery操作符

    **不要把BOOL型变量直接与YES比较

  • 相关阅读:
    数据结构:树[data struct: tree]
    关于计算机学科的一些期刊和会议(转)
    这个世界究竟是怎么了
    [思考]怎么在C#中加入新功能
    vsta相关
    Practical numerical methods with C#
    C# (CSharp)中的foreach,for关键词
    代码生成相关
    没有可用于当前位置的源代码 解决办法
    access数据库删除两个日期之间 的数据 SQL语句
  • 原文地址:https://www.cnblogs.com/cc-Cheng/p/3312661.html
Copyright © 2011-2022 走看看