概述
<h6><a style="text-decoration: none; ">1.1. 为什么要用bool</a>类型、</h6><p>因
为我曾经看到过C++程序员,使用着C++的编译器,却仍然在使用BOOL、TRUE、FALSE等宏来表达现实世界中的二值事物,令我很不解,前去询问
才知是“习惯”。显然,它以前是使用C语言编程的,而且使用这些宏做了很多事,也从来没有感觉到不好,为什么要用内置的bool类型呢,至少有两个优点,
下面分别讨论。</p><h6><a style="text-decoration: none; ">1.1.1. 提高程序的可读性</a></h6><p>Boolean(布
尔)数据在C++中使用内置类型bool表示。bool类型的变量只可能有两个值true或false,在现实世界中它用于表示“是”或“否”、“高”或
“低”等这种只有两个状态的事物再自然不过。例如用于表示检测某年是否润年的函数,其返回值类型显示只有两种情况“是”或“否”,如代码1 -1所示。</p><p>// 代码 1-1</p><p>bool IsLeapYear( const unsigned int year)</p><p>{</p><p>return (year % 4==0 && year % 100 !=0) || (year %400 ==0);</p><p>}</p><p>这样用一个bool型变量来表示该函数的返回值,看起来非常自然。而在C语言(C99之前,而且目前很多编译器没有完整实现C99)中没有内置boolean类型,只能使用宏、typedef、enum等手段模拟出bool类型来,如代码1-2使用enum模拟。</p><p>// 代码 1-2</p><p>typedef enum {</p><p>false = 0,</p><p>true = 1</p><p>}bool;</p><p>有了这样的定义,使得在C语言的编译器中代码1-1中的代码也是可以编译的,而在Windows的API中则使用typedef了宏定义了一种类型BOOL,其实实现了与bool同样的效果。</p><p>// 代码1-3</p><p>typedef int BOOL;</p><p>#ifndef FALSE</p><p>#define FALSE 0</p><p>#endif</p><p>#ifndef TRUE</p><p>#define TRUE 1</p><p>#endif</p><p>没有统一的布尔类型在大型的工程项中特别是用到第三方程序库时,可能使用不同的手段模拟布尔类型以提交代码的可读性,这样会使得代码有些混乱。C++引入了bool内置类型,解决了代码的一致性问题。</p><h6><a style="text-decoration: none; ">1.1.2. 提高程序的性能</a></h6><p>虽然bool类型在C++标准中并没有要求一致的实现,但绝大多数编译器都将其实现为1字节,即sizeof(bool)的值为1,加上其只有两个值的值域{true, false},应该算作C++中最小的数据类型了。</p><p>虽
然char、unsigned char和signed
char类型在C++中没有特定的实现要求,但一般也实现为一个字节,这样看来与bool类型从内存空间的占用上并没有性能上的差异。似乎使用代码1-4
中的代码模拟bool类型可以实现与C++内置bool类型同样的性能,但对于一些特殊的CPU例外。对于一些嵌入式系统常用的微控制器,如MCS-
51、Atmel
AVR系列,其片内RAM都包含一个按位操作的位存储区,这些区域内的内存的每一位都可以独立寻址进行读/写操作,那么在这些控制器的程序中,编译器就可
以对其进行优化,将bool类型的一个变量实现为位操作存储区的某个位,这样可以在既不影响运行效率的情况下减少对内部RAM的占用,因为对于这些微型控
制器来讲,内部RAM的每一位都很宝贵。</p><p>// 代码1-4</p><p>typedef unsigned char bool;</p><p>enum {</p><p>false = 0,</p><p>true = 1</p><p>};</p><p>如果使用模拟方式,不论是int型还是char型,编译器都无从知道我们只用到它的0和1两个值,即使目标CPU支持位操作,编译器也不能够对代码进行优化。</p><p>所以,使用bool类型,不仅可以使程序读起来更自然、一致,提高程序的可读性,而且可以给编译器优化代码的机会,所以在C++程序中应尽可能使用内置的bool类型,而不是通过任何手段模拟的bool类型。</p><h6>1.1.3. 使用bool类型的一些建议</h6><h6>1.1.3.1. 不要使用位运算符</h6><p>从
理论上讲,对于bool类型只需要一个比特(bit)就够了,根本不需要一个字节,即使使用一个字节甚至四个字节,一般的也只需要用到其中一位。假设使用
最低位,那么使用逻辑运算符&&、||、!与使用位运算符&、|、~效果是一样的,但是看起来还是有些怪怪的,有专门为之设计的
运算符为什么不用呢?所以对于逻辑操作应该使用逻辑运算符,不要使用位运算符搞怪。</p><h6>1.1.3.2. 使用!运算符的别名not</h6><p>对
于条件执行语句if的条件表达式,最好使用if( ! cond ) 或if( cond )而不要使用if( cond == true)或if(
cond == false),避免不小心写成if(cond = true)或if(cond = false)造成程序逻辑错误。</p><p>如果
你用的编译器支持运算符!的别名not,而你也想提高可读性则可以使用not替换!运算符,写作if( not
true),而且鼓励这样写,如代码1-5。not是C++标准的关键词,但如果您的代码要求可移植性比较高,还是不要使用该关键词,因为有些编译器可能
不支持该特性。如果您还是喜欢用not,同可以使用#define预处理指令定义为宏。当然对于&&和||、^您都可以使用其别
名:and、or、xor。</p><p>// 代码1-5</p><p>#if NOT_SUPPORT_ALTER_TOKEN_NOT</p><p>#define not !</p><p>#endif</p><p>bool ready; <br>…</p><p>if( not ready){ <br>// get ready here <br>}</p></div></font></span>
最后
以上就是傻傻大地为你收集整理的C++为什么要用bool类型的全部内容,希望文章能够帮你解决C++为什么要用bool类型所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复