Chinaunix首页 | 论坛 | 博客
  • 博客访问: 987952
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

2012年(158)

我的朋友

分类: C/C++

2012-11-20 09:33:03

C++中布尔类型关键字名称是bool,只存在两个状态:true 和 false;
C(当然是指最近的C99标准)中布尔类型关键字名称是_Bool, 按理只应该存在两个状态: 1 和 0;
同时在stdbool.h中存在几个宏,内容如下:
#define bool _Bool
#define true 1
#define false 0
VC++6.0是一个C/C++编译器,因此它包含C++的bool,但因为VC++6.0不支持C99标准,因此不含C的_Bool,VC++6.0独有的布尔类型是BOOL,它不是关键字,定义于windef.h中
typedef int     BOOL;
在MFC的头文件afx.h中定义
#define FALSE   0
#define TRUE    1

布尔类型按理只应该存在两个状态:真(1) 和 假(0)。
布尔型转化为整型(布尔型当然也属于整形)时,真为1,假为0;
整型转化为布尔型时,非0(未必只有1)即真(1),0即假(0)。
因为_Bool和bool是C++的内建类型,因此非0转化为布尔型时,非0都变为1(真),除非你使用变态的
bool b;
scanf( "%d", &b ) 或 *(int*)&b = 2; 等手段。
但要注意的是VC中特有的BOOL只是一个int,它不可能将非0的值都转化为1,比如
BOOL b = 3;
此时 b 是 真 状态,但它不等于TRUE。

bool(包括_Bool)类型的比较:
1. 布尔类型本身就是比较结果的类型,因此无须再次将布尔变量和真假状态进行比较。
if( b == true ) 和 if( b == false ) 是多余的,应当直接写成
if( b ) 和 if( !b )
2. 两个布尔变量的比较,写法如下:
if( a == b ) 和 if( a != b )


BOOL类型的比较:
1. 布尔类型本身就是比较结果的类型,因此无须再次将布尔变量和真假状态进行比较。
if( b == TRUE ) 和 if( b == FALSE ) 是多余的,其实也是错误的。
正确的比较方法是:
if( b ) 和 if( !b )
2. 如果一定要将布尔变量和真假进行比较,应该使用如下语句:
if( b != FALSE ) 和 if( b == FALSE ),道理上面说过了,BOOL为'真'状态时未必就等于TRUE。
3. 两个布尔变量的比较
错误的做法:
if( a == b ) 和 if( a != b )
正确的做法:
if( ( a && b ) || ( !a && !b ) ) 和 if( ( a && !b ) || ( !a && b ) )

能不用BOOL就别用BOOL
1. 如上所述,它有很多隐患
2. BOOL是VC特有的,不属于C/C++内容。

-------------- 2007-05-10 补充 --------------
C++规定对一个bool左值做++运算,其值为true。
也就是说即使你通过强制的手段在一个bool变量中放入了-1,执行++后,值也为1,而不是0

阅读(1013) | 评论(5) | 转发(0) |
0

上一篇:实在是令人哀伤

下一篇:[搞笑篇] VC 对 GCC

给主人留下些什么吧!~~

网友评论2012-11-20 09:35:21

BNJ
如果你就是想存个状态,似乎char是上选
如果你就是想存n个状态,bitset<>.

网友评论2012-11-20 09:35:12

shanzy
M$可能说:端着锅吃吧,别用碗了,省得到最后又得洗锅又得洗碗......

网友评论2012-11-20 09:35:03

shanzy
其实,还在windef.h中:

#ifndef FALSE
#define FALSE               0
#endif

#ifndef TRUE
#define TRUE                1
#endif

网友评论2012-11-20 09:34:53

周星星
ISO14882 第 5.3.3节(第77页)有两句话:
“in particular. sizeof(bool) and sizeof(wchar_t) are implementaion-defined.”
“sizeof(bool) is not required to be 1.”

既然由实现定义,何必在意各个编译器是什么实现的呢?只要知道它未必等于1字节就成。

网友评论2012-11-20 09:34:36

iwaswzq
vc5.0以后,bool类型只有1个字节,加上这个说明,并且举个例子说明它的影响,你这个文章就更完善了。:)