【转】Objective-C BOOl、bool比较

 
 
布尔值
宏定义 真为YES 假为NO 


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(例如8960,写成十六进制0x2300),BOOL值将会是0,即NO值。
 
BOOL
在其大多数历史阶段,C都缺乏一个定义的布尔类型。它通过计算表达式来确定真值。如果一个表达式计算为0,则被认为是假;相反,则为真。
C99标准添加了一个布尔类型,bool,并且还添加了真值true和假值false。Objective-C有自己的布尔类型,BOOL,并且还有真值常量YES和假值常量NO。
BOOL不是一个基本类型。它是无符号的char的一个typedef(别名)。YES和NO只是为1和0定义的常量。
由于Objective-C继承了所有的C类型,因此我们可以在自己的Objective-C程序中使用bool类型。
然而,Cocoa框架和大多数已有的Objective-C代码使用BOOL。尽管可以在bool和BOOL之间相互转换,除非你的程序用到的库使用了bool,否则干脆忘掉bool会更容易一些。
注意   尽管Objective-C当前的版本是基于C99标准的,但Objective-C最初只是作为缺乏布尔类型的一个较早版本的C的扩展而开发的。
尽管C99的bool类型也可以使用,但大多数Objective-C社群使用Objective-C的BOOL。


SEL
SEL是保存了一个Objective-C方法名表示的一种类型。SEL是selector的缩写。方法名有时候叫做选择器,因为运行时使用它们来选择要执行的代码,以响应一条消息。

IMP
IMP是一个typedef,用于“一个指针,它指向接受参数id、SEL及可能的其他参数并且返回id的函数”。
 
BOOL和bool的区别
1、类型不同  
BOOL为int型  bool为布尔型  
 2、长度不同  
bool只有一个字节  
BOOL长度视实际环境来定,一般可认为是4个字节
3、取值不同  
bool取值false和true,是0和1的区别; false可以代表0,但true有很多种,并非只有1。 
 如果数个bool对象列在一起,可能会各占一个bit,这取决于编译器。 
 BOOL是微软定义的typedef int BOOL(在windef.h中)。
布尔型变量bool
bool是布尔型变量,也就是逻辑型变量的定义符,类似于float,double等,只不过float定义浮点型,double定义双精度浮点型。 
在objective-c中提供了相似的类型BOOL,它具有YES值和NO值。 布尔型变量的值只有 真 (true) 和假 (false)。 
 布尔型变量可用于逻辑表达式,也就是“或”“与”“非”之类的逻辑运算和大于小于之类的关系运算,逻辑表达式运算结果为真或为假。  
 bool可用于定义函数类型为布尔型,函数里可以有 return TRUE; return FALSE 之类的语句。 
 布尔型运算结果常用于条件语句,  
 if (逻辑表达式)  
{   
       如果是 true 执行这里; 

else 

      如果是 false 执行这里;   
}; 


BOOL在iphone程序开发中很重要,一般配合if语句进行判断,处理程序中逻辑关系!
 
if 语句与布尔值
if 语句是 C++/C 语言中最简单、最常用的语句,然而很多程序员用隐含错误的方式
写 if 语句。
假设布尔变量名字为 flag,它与零值比较的标准 if 语句如下:
if (flag) // 表示 flag 为真
if (!flag) // 表示 flag 为假
其它的用法都属于不良风格,例如:
if (flag == TRUE)
if (flag == 1 )
if (flag == FALSE)
if (flag == 0)
 
BOOL,int,float,指针变量 与“零值”比较的if语句
分别给出BOOL,int,float,指针变量 与“零值”比较的 if 语句(假设变量名为var)
    解答:
    BOOL型变量:if(!var)
    int型变量: if(var==0)
    float型变量:
    const float EPSINON = 0.00001;
    if ((x >= - EPSINON) && (x <= EPSINON)
    指针变量:  if(var==NULL)
    剖析:
    考查对0值判断的“内功”,BOOL型变量的0判断完全可以写成if(var==0),而int型变量也可以写成if(!var),指针变量的判断也可以写成if(!var),
上述写法虽然程序都能正确运行,但是未能清晰地表达程序的意思。一般的,如果想让if判断一个变量的“真”、“假”,应直接使用if(var)、if(!var),表明其为“逻辑”判断;
如果用if判断一个数值型变量(short、int、long等),应该用if(var==0),表明是与0进行“数值”上的比较;而判断指针则适宜用if(var==NULL),这是一种很好的编程习惯。
    浮点型变量并不精确,所以不可将float变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。如果写成if (x == 0.0),则判为错,得0分。
原文地址:https://www.cnblogs.com/cc-Cheng/p/3342351.html