C++中为什么使用bool类型

1.1. 为什么要用bool类型、
因为我曾经看到过C++程序员,使用着C++的编译器,却仍然在使用BOOL、TRUE、FALSE等宏来表达现实世界中的二值事物,令我很不解,前去询问才知是“习惯”。显然,它以前是使用C语言编程的,而且使用这些宏做了很多事,也从来没有感觉到不好,为什么要用内置的bool类型呢,至少有两个优点,下面分别讨论。

1.1.1. 提高程序的可读性
Boolean(布尔)数据在C++中使用内置类型bool表示。bool类型的变量只可能有两个值true或false,在现实世界中它用于表示“是”或“否”、“高”或“低”等这种只有两个状态的事物再自然不过。例如用于表示检测某年是否润年的函数,其返回值类型显示只有两种情况“是”或“否”,如代码1 -1所示。

// 代码 1-1

bool IsLeapYear( const unsigned int year)

{

return (year % 4==0 && year % 100 !=0) || (year %400 ==0);

}

这样用一个bool型变量来表示该函数的返回值,看起来非常自然。而在C语言(C99之前,而且目前很多编译器没有完整实现C99)中没有内置boolean类型,只能使用宏、typedef、enum等手段模拟出bool类型来,如代码1-2使用enum模拟

// 代码 1-2

typedef enum {

false = 0,

true = 1

}bool;

有了这样的定义,使得在C语言的编译器中代码1-1中的代码也是可以编译的,而在Windows的API中则使用typedef了宏定义了一种类型BOOL,其实实现了与bool同样的效果。

// 代码1-3

typedef int BOOL;

#ifndef FALSE

#define FALSE 0

#endif

#ifndef TRUE

#define TRUE 1

#endif

没有统一的布尔类型在大型的工程项中特别是用到第三方程序库时,可能使用不同的手段模拟布尔类型以提交代码的可读性,这样会使得代码有些混乱。C++引入了bool内置类型,解决了代码的一致性问题。

1.1.2. 提高程序的性能
虽然bool类型在C++标准中并没有要求一致的实现,但绝大多数编译器都将其实现为1字节,即sizeof(bool)的值为1,加上其只有两个值的值域{true, false},应该算作C++中最小的数据类型了。

虽然char、unsigned char和signed char类型在C++中没有特定的实现要求,但一般也实现为一个字节,这样看来与bool类型从内存空间的占用上并没有性能上的差异。似乎使用代码1-4中的代码模拟bool类型可以实现与C++内置bool类型同样的性能,但对于一些特殊的CPU例外。对于一些嵌入式系统常用的微控制器,如MCS-51、Atmel AVR系列,其片内RAM都包含一个按位操作的位存储区,这些区域内的内存的每一位都可以独立寻址进行读/写操作,那么在这些控制器的程序中,编译器就可以对其进行优化,将bool类型的一个变量实现为位操作存储区的某个位,这样可以在既不影响运行效率的情况下减少对内部RAM的占用,因为对于这些微型控制器来讲,内部RAM的每一位都很宝贵。

// 代码1-4

typedef unsigned char bool;

enum {

false = 0,

true = 1

};

如果使用模拟方式,不论是int型还是char型,编译器都无从知道我们只用到它的0和1两个值,即使目标CPU支持位操作,编译器也不能够对代码进行优化。

所以,使用bool类型,不仅可以使程序读起来更自然、一致,提高程序的可读性,而且可以给编译器优化代码的机会,所以在C++程序中应尽可能使用内置的bool类型,而不是通过任何手段模拟的bool类型

1.1.3. 使用bool类型的一些建议
1.1.3.1. 不要使用位运算符
从理论上讲,对于bool类型只需要一个比特(bit)就够了,根本不需要一个字节,即使使用一个字节甚至四个字节,一般的也只需要用到其中一位。假设使用最低位,那么使用逻辑运算符&&、||、!与使用位运算符&、|、~效果是一样的,但是看起来还是有些怪怪的,有专门为之设计的运算符为什么不用呢?所以对于逻辑操作应该使用逻辑运算符,不要使用位运算符搞怪。

1.1.3.2. 使用!运算符的别名not
对于条件执行语句if的条件表达式,最好使用if( ! cond ) 或if( cond )而不要使用if( cond == true)或if( cond == false),避免不小心写成if(cond = true)或if(cond = false)造成程序逻辑错误。

如果你用的编译器支持运算符!的别名not,而你也想提高可读性则可以使用not替换!运算符,写作if( not true),而且鼓励这样写,如代码1-5。not是C++标准的关键词,但如果您的代码要求可移植性比较高,还是不要使用该关键词,因为有些编译器可能不支持该特性。如果您还是喜欢用not,同可以使用#define预处理指令定义为宏。当然对于&&和||、^您都可以使用其别名:and、or、xor

// 代码1-5

#if NOT_SUPPORT_ALTER_TOKEN_NOT

#define not !

#endif

bool ready;

if( not ready){
// get ready here
}

怎样返回一个bool类型?

问题:public bool check(string a,string b)
{ ......
    if (...)
    return true;
    else
    retrun false;
}
为何编译时出错:
"check :并非所有的代码路径都返回值"
应怎样写才对啊!!

答:在方法里面先定义一个bool值,确保每种情况都有一个返回值。
public bool check(string a,string b)
{ ......
    bool returnValue = false;
    if (...){
     returnValue = true;
    }
    else{
     returnValue = false;
    }
    return returnValue;
}

要返回的值,在各种情况下,都应该有一个return。可以使用上面的方法,定义一个ret,给他一个初始值,最后return就可以了。

展开阅读全文

没有更多推荐了,返回首页