【转】Objective-C BOOl、bool比较

http://blog.sina.com.cn/s/blog_a004f38f01013kqj.html

http://www.cocoachina.com/bbs/read.php?tid=73570&fpage=2&page=11

布尔值

宏定义 真为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分。