C++语言零基础入门教程:4.10 布尔类型的编程应用分析

3735 人浏览 | 时间: 2016-08-13 22:02:01 | 作者: codexia 会员文章,禁止转载

    在《C++语言零基础入门教程:4.9 布尔(真假)类型的思想分析》一节中,我对比了人类的复杂逻辑和计算机的简单的逻辑规则,让我们深入了解计算机的逻辑思想,这样学习起来感觉有血有肉,而不是冰冷冷的编程知识而已。
    在了解了背后的思想,对于今后编程还是很有好处的,至少你可以:装逼!!而且装一个成功一个!哈哈哈哈。说实话,对于你理解计算机确实有很大的帮助,所以,不要以为是罗里吧嗦的废话。你要知道,我的教程是注入思想了的,不是简单的编程教程,要教会你思考,教会你思想,教会你方法。
    前面了解到了布尔类型是表示正确与错误或者对与错或者真与假,你可以看到,始终布尔类型只有两个取值,所以,布尔类型也可以理解为二值类型,也就是取值只有两个值。不像数值类型,要多大有多大,只要你给的内存位数够长以及表示方法够牛逼,也不想字符类型,只要字符集大,表示的内容也就大,当然也要位数够长。位数够长就好像你手指越多,可以掰手指计数的数字越多。
    布尔类型只有两个值可以取,而我们的编译器通常用一个整型类型int来表示布尔型的。你肯定会觉得,这样好TM浪费内存呀。我布尔值只有两个取值,你给我整这么多位的类型。当然,具体用多少位来实现布尔类型并没有规定,这取决于实现,不同的编译器实现的不一样,所以这是不同编译器的差别。
    在C/C++中的布尔值的取值规则是:0为假,非零即真。就这个规则,没有其他了。这是判断真假的根本原则。至于假代表什么,真代表什么,你说了算。真的。如果你说假代表有钱,那么真就代表没有钱,如果你说假代表富人,那么真就代表穷人。没有比较富比较穷的人,只有富人和穷人,因为布尔类型只有两个取值。当然,也可以反过来。
    一般来说,布尔值应用在条件判断或者状态测试中。比如如果前面有一堆食物,你要决定去不去吃,你就要先做一个判断。判断的标准就是好吃不好吃。如果你可以用真代表好吃,那么假就自然而然代表不好吃。如果你用真代表不好吃,那么假自然就代表好吃。这个和量子物理的量子纠缠态是一样的,真假代表的意义开始是不确定的,但凡你确定了一个,另一个也随之确定了。你确定的就是真或者假代表的是一种对立的状态。
    还有一种典型的应用就是,检测状态。如果到吃饭的时间点了,你首先要做的不是立马去吃饭,而是先检测一下自己的状态,确定是不是饿了。如果不饿,可能你吃不下饭,没有胃口,就可以等一会再去吃饭。那么你检测的结果也就可以用一个布尔类型的值返回。你检测的是是否饿了,返回值为真,那么就可以表示真的饿了,那么就可以去吃饭了。如果返回的值是假,那么表示是假饿,也就是不饿,这样可以等会再去吃饭。换一种检测方式,你可以检测是否不饿。如果返回真,那么表示真的不饿,如果返回假,表示假的不饿,也就饿了。
    所以,一般在编程中,布尔类型的值成为真假最合适。在程序中,没有对错的思想概念,布尔值的使用只是用于状态测试,表示两个对立的状态而已,没有计算机去纠结对错,计算机里又不用打官司。
    而用于检测的,一般可以包装成一个工具,叫做函数。后面我们会介绍函数的,这里就不解释了。
    知道了布尔值取值的真假两个值,那么在编程中这两个值到底怎么写呢?难道写汉字的真假吗?当然不是,我们用true表示真,用false表示假。下面是一段简单的布尔值的定义和使用:

bool ok = true;
bool good = ok;
    bool是布尔值类型的关键词,在上一节中讲过。这里看到的都是英语单词,是不是很害怕!英语不好的同学,是不是以为,代码里都要英语单词呀,英语没学好岂不是学编程很难?
    不是的。ok 和 good都是单词,不过这两个是变量名。变量就是可以改变值的量,为了方便使用才要取一个值。因为变量可以改变值,所以我们可以给它设置另一个值。操作变量就是利用变量的名称,也就是这里看到的ok和good。不过,我们如果英语不好,可以用拼音来取名,如果拼音也不好,可以直接用26个字符随便组合。当然,变量的命名以及常量这些东西,我们暂时不要去深究,后面会详细介绍的。所以我懂拼音可以这样写:
bool hao = true;//好的拼音
bool niubi = hao;//牛逼的拼音
    代码一样很好。如果拼音不好,也没有关系,可以这样:
bool aaa = true;
bool bbb = aaa;
    这是随便组合的变量名,这样是不是看起来没有英语和拼音的压力了呢。然而,bool和true、false因为是关键词,所以必须这样写,连大小写都要正确。
    我们前面说了,C/C++的布尔值的取值规则是:0即假fasle,非零即真true。如果你觉得写true和false麻烦,也可以这样:
bool aaa = 1;//编译器会将数值类型1转换为true的。
bool bbb = aaa;
    不过,因为关键词也不会很多,这些词也很简单,还是要写熟练,就记住了。这样说只是让你尽量不要有心理压力,而不是让你放弃成为优秀的人。如果你英语好,这些关键词看起来都觉得舒服些,那岂不是更好。记几个单词而已,其实英语并不大。不过因为英文的资料还是很多的,如果想变得优秀,好的英语确实可以如虎添翼。但是没有强悍的英语也不要太担心,我们C++技术网这样的中文技术站可以给你提供大量的有价值的技术资料。
    前面说了,布尔值只需要两个取值,按理说,我们使用计算机的比特位一位就够了,一个比特位可以取值0或者1,这不是和布尔类型天然一对嘛。但是为什么有些编译器并不是将布尔值当做一个比特实现呢,而是用int这样的类型实现呢?
    我们在32位系统中,计算机一次性处理数据的位数就是32位的。那么32个比特位就是每一次读写的最小单位。那你想想,既然计算机每次最少要取32位,那么定义一个比特作为布尔类型,最终读写一个布尔值,不还是得取32位吗?而且,如果我们利用了其中一位,剩余的31位不就不是整条数据了嘛。而一个字节是8位,这样31位不能整除8位,硬生生的将比特位拆散,这样就导致剩余的31位的使用变得麻烦,虽然节省了内存,但是却增加了内存使用的复杂性,因为要指定一套策略去将拆散的比特位利用上。不然为了利用一个比特,浪费31个比特,这笔账怎么算都是不划算呀。
    既然拆散了不好利用,那我用一个字节即8比特来表示布尔值,这样不就是整的,剩余的三个字节也可以当做char或者short使用。是的,这样确实可以的哦。这是一种实现,这样代价比较低。不过现在内存便宜了,所以很多时候,为了实现方便,就不会太在意这样的精细利用了,不划算,所以就直接用32位即4个字节一般就是int类型来实现布尔类型bool。这样一次布尔值读写,就读写一次内存,而且不用做多余的处理,简单直接。所以效率很高,这也是为什么很多编译要用32位作为bool的占用内存大小。比如Windows中用BOOL代表的布尔值类型就是int的基本类型定义的一个类型别名。我们了解到这里就差不多了。
当前文章为会员文章,请前往[用户中心]开通会员后继续阅读。