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比较

  • 相关阅读:
    vue中$refs、$slot、$nextTick相关的语法
    js中hash、hashchange事件
    js中filter的用法
    ES6新特性-函数的简写(箭头函数)
    js中把ajax获取的数据转化成树状结构(并做成多级联动效果)
    jq中get()和eq()的区别
    new Date() 日期格式处理
    微信小程序 加载图片时,先拉长,再恢复正常
    一个例子理解ES6的yield关键字
    eclipse在光标停留在同一对象的背景色提示,开启与关闭
  • 原文地址:https://www.cnblogs.com/cc-Cheng/p/3312661.html
Copyright © 2011-2022 走看看