当前课程知识点:基于Linux的C++ > 第二讲 程序控制结构 > 2.3 布尔数据 > LinuxCPP0203
接下来一个主题为布尔数据
所谓布尔数据就是一个值
只有真或假两种可能的数据量
我们就称它为布尔数据量
我们首先从枚举型开始
然后是用户自定义数据型
先看枚举型 枚举就是一一列举
编程的过程中有一些很特殊的量
这些量的取值范围极其有限
比如有这样一个例子
我要取自然月份 自然月份有多少呢
公元纪年自然月份就12个月份
从January、February一直到
November、December就那么12个
如果你使用一个int来表达它
那实际上它可以取任何一个整数值
0可以 1可以 12可以 13也可以 -1也可以
问题是如果你映射
1代表1月
2代表2月 然后12代表12月
13代表啥 0代表啥 -1代表啥啊
就有一些量你用不到
但是你在程序中又不能够限制它
把-1、13这样的量
赋值给这样一个整型量
也就是说你不可能限制它
只能得到有效的月份
所以在这种情况下
我们建议应该使用一个枚举型
把它枚举出来
既然它的月份就这么多 12个月
OK 我定义一个 enum MONTH
一个枚举型的月份
我们定义的是一个类型
它不是一个变量
特别注意这一点
后面跟着花括号对
用逗号来分割开的
一个又一个元素名字
那就是枚举文字
一个又一个元素的名字
计算机内部是怎么来存储
这个枚举型数据对象呢
实际上呢 它有一个很特别的规则
内部要把它映射成一个整数
而且在映射的时候它有一个基本的逻辑
就是最顶头的这个文字映射成0
后面的文字 自动是前面那个文字加1
January映射成0
February映射成1
然后是March映射成2
按照这个顺序来映射
你可能就会觉得明明是1月
它的值最后相当于整数的0
这个多不好啊
那我怎么办呢 我把它设成January
从1开始行不行 可以
你就可以在定义这个枚举文字的时候
后面加上一个初始化记号(“=”)
January初始化成1逗号
就表示从1开始起头
后面就依次递增
就按照这个模式去设计就可以了
基本格式就是这样
这就完成了枚举类型的定义
有了这个枚举类型
我们就可以定义枚举类型的变量
MONTH后面跟着一个小month
前面大MONTH
大写那个是枚举类型
月份类型的名字
后面小month就是月份变量的名字
然后这个变量就可以被赋值了
month 就可以赋值为January JAN
可以赋值为 FEB
虽然等价于一个整数
在我们的计算内部是这么保存的
但是在我们编程的时候
你不可以直接传一个整数给它
这样的话编译器就会说
一个是int类型 一个是enum MONTH
两者类型是不匹配的
这有助于帮助我们
检查出程序的书写错误
这是枚举类型的好处
然后更重要的一个特点就是
我们有了枚举类型
就可以将这些文字合并在一处
可以取代魔数
1月、2月、3月真实的数值
来表达我们月份信息
这是一个月份概念
相类似的概念有很多
你比如性别 男性、女性 MALE、FEMALE
两个枚举OK了
星期从SUNDAY、MONDAY
一直到SATURDAY 枚举完
这就是很典型的枚举类型的定义
我们后面会看到这方面的例子
接下来就是用户自定义的类型
我们可以使用typedef这样一个新的关键字
来定义一个新的类型
比如说typedef int DWORD
我就把int重新定义成一个新的类型
叫DWORD
DWORD这个产生出来的新的类型
它在性质上和int是等价的
凡是能够出现int的地方
都可以使用DWORD
凡是能够出现DWORD的地方
都可以使用int
作为两个类型的名字
类型名字是不一样的
但是类型性质一模一样
有了这个概念
就可以定义新的布尔类型
C++里面提供了bool这个类型
用来表达一个布尔数据
真或假值的这种类型的数据
然后两个关键字 false和true
也给你提供好了
false表示0
true表示1
BOOL也是关键字
这三个关键字在C++里面是有的
在C里面是没有的
如果你写的是C程序
你不能使用这个布尔类型
这是C++的概念
定义变量很简单
布尔类型的量modified
一个数据对象如果有更新的话
那modified就给它设成true
如果没有更新的话
modified就设为false
有什么好处呢
这样的话我就可以通过modified这个值
来决定我们数据有没有更新
如果数据更新了
我就可能向外界磁盘写出去
这样的话 就把这个数据持久化了
这是一个非常重要的概念
有了布尔变量的概念
现在我们就来讨论关系表达式
在我们C/C++代码里面
关系表达式有六个关系操作符
一个是“>”
一个是“==”
还有“<”、“<=”、“>=”、“!=”
就这么六个
“=”符号你记住
它已经被用于赋值符号
赋值表达式 初始化表达式了 对吧
这个地方不能使用“=”了
必须使用“==”
来表达真实的等号概念
双等号表达真正等号
这是等号表达式
因为两侧可以对调
左边和右边可以对调 就是等于
不等于的话 也没有“”符号
所以它要用一个“!=”来表达
不大于和不小于一样
关系表达式的结果就是true和false
你问a > b吗?a >= b吗?
结果就是false和true
要么是假的 要么是真的
出来的结果我们称之为逻辑值
也就是所谓的布尔值
在早期C语言里面
没有引入布尔类型之前
C是怎么来表达这个逻辑值
这个关系表达式或者逻辑表达式的
运算结果的呢
它有个很特别的规定
在C/C++中它用0表示假 非0表示真
如果一个数据值为0 那就是假的
如果是非0 那就是真
所以 1是真的 2是真的0.1真的
还有“hello World”非0 真的
它就对应于true
到了C++语言里面 因为有了布尔类型
所以我们应该尽量使用布尔类型
而别再使用0和非0来做验证
但是有的时候
因为我们要写的程序代码
要涉及到很多Linux操作系统的功能
它的很多系统代码实际上是早期的代码
都是使用C来实现的
所以C的很多架构我们还离不开
第二个就是逻辑表达式
逻辑表达式对于两个逻辑量
做一些特定的运算
这两个逻辑量从哪来呢
它也可以从其它关系表达式里面来
也可以其它逻辑表达式里面来
逻辑操作符在C++代码里面提供了三种
一种逻辑与
它使用“&&”那个记号
连续两个“&&”
注意中间不能有空格的
有空格的话
它就解析成两个操作符了
“||”表示逻辑或
逻辑非就用“!”
逻辑表达式运算有一个基本逻辑
如果我有两个量 x和y
它这个逻辑量呢
如果x && y
它的意思就是如果x和y都为真的
那结果就是真的
有一个为假的结果就是假的
如果是逻辑或呢 x和y
如果两个有一个为真
那结果一定是真的
只有两个都为假
那结果才是假的
逻辑非 !X
它这个一元表达式
那就是x原来是真的
那结果就是假的
原来是假的结果就是真的
可以用逻辑表达式和前面的关系表达式
构造复杂表达式
比如说x > y || a != b && 3 <= 2
按照这个格式 可以写复杂逻辑表达式
关系操作符有六个
逻辑操作符有三个
总共就有9个操作符
这些操作符的优先级是有顺序的
所以同学们在写逻辑表达式的时候
一定要特别记住它们优先级的顺序
优先级从高到低的排序是
“!”最高
接下来是“<”、“>=”
“>”、“<=”四个
就是大小关系判断
它们这四个是同级的
它们的结合性都是从左到右的
所以先做左边的 后算右边的
接下来优先级比他们低的就是“==”和“!=”
这两个优先级是一样高的
再接下来优先级是“&&”
优先级别最低是“||”
按照这个顺序
基本上和我们的直觉是吻合的
我们可以看这样一个例子
给你一个年份year
然后判定它是不是闰年
闰年计算当然有一个标准规定
首先看能不能被4整除
能够被4整除的年份是闰年
一开始是这么定的
后来发现这样的话
我们就把闰年算多了
后来我们怎么办呢
我们就减 把算多的部分减掉
怎么减 减100
能够被100整除的年份那就不算闰年
发现减多了
后来怎么办呢
我们又把400再给加上
能够被400整除的年份就是闰年了
告诉你 加上400以后其实又加多了
还要再减 减什么呢 要减8000
能够被8000整除的年份就不是闰年
不过我们公元纪年到现在也才2015年
8000年一轮回那东西
我们一时半会不用去考虑了
所以我们到这儿就行了
你算这个
这样一个逻辑、关系表达式
怎么去计算呢
这个逻辑表达式计算
是非常让人头疼一个东西
为什么呢
因为它特别局限于细节
而且这个与、或关系实际上非常复杂
稍微复杂一点就很难弄
那么怎么办呢
我们就画它的集合关系图
有一个全集
我们在里面画了一个椭圆
这个椭圆中
凡是能够被4整除的年份都在这里
然后其中
凡是能够被100整除的年份都在这里
然后400也一样
你看我们这个例子
对于我们这道题 这三个条件
算出来是什么呢
能够被4整除的年份和
不能被100整除的年份
就是外面这一圈
然后能被400整除的年份
是最内圈的这个椭圆
所以我们的结论就是
我们要求那个闰年
就是这两个集合的并集
year % 4 == 0
这表示它能够被4整除的年份
且year % 100 != 0
我们得到了这个环
然后并集 或year % 400 == 0
能够被400整除
这个就是我们最后的计算式子
-1.1 提纲
-1.2 程序设计的基本概念
-1.3 简单C/C++程序介绍
-1.4 程序设计的基本流程
-1.5 基本语法元素
-1.6 程序设计风格
-1.7 编程实践
-第一讲 C/C++基本语法元素--编程实践提交入口
-2.1 提纲
-2.2 结构化程序设计基础
-2.3 布尔数据
-2.4 分支结构
-2.5 break语句
-2.6 循环结构
-2.7 编程实践
-第二讲 程序控制结构--编程实践提交入口
-3.1 提纲
-3.2 函数声明、调用与定义
-3.3 函数调用栈框架
-3.4 编程实践
-第三讲 函数--编程实践提交入口
-4.1 提纲
-4.2 算法概念与特征
-4.3 算法描述
-4.4 算法设计与实现
-4.5 递归算法(一)
-4.6 递归算法(二)
-4.7 容错与计算复杂度
-4.8 编程实践
-第四讲 算法--编程实践提交入口
-5.1 提纲
-5.2 库与接口
-5.3 随机数库(一)
-5.4 随机数库(二)
-5.5 作用域与生存期
-5.6 典型软件开发流程(一)
-5.7 典型软件开发流程(二)
-5.8 编程实践
-第五讲 程序组织与开发方法--编程实践提交入口
-6.1 提纲
-6.2 字符
-6.3 数组(一)
-6.4 数组(二)
-6.5 结构体
-6.6 编程实践
-第六讲 复合数据类型--编程实践提交入口
-7.1 提纲
-7.2 指针基本概念
-7.3 指针与函数
-7.4 指针与复合数据类型(一)
-7.5 指针与复合数据类型(二)
-7.6 字符串
-7.7 动态存储管理(一)
-7.8 动态存储管理(二)
-7.9 引用
-7.10 编程实践
-第七讲 指针与引用--编程实践提交入口
-8.1 提纲
-8.2 数据抽象(一)
-8.3 数据抽象(二)
-8.4 链表(一)
-8.5 链表(二)
-8.6 链表(三)
-8.7 链表(四)
-8.8 函数指针(一)
-8.9 函数指针(二)
-8.10 抽象链表(一)
-8.11 抽象链表(二)
-8.12 编程实践
-第八讲 链表与程序抽象--编程实践提交入口
-9.1 提纲
-9.2 程序抽象与面向对象
-9.3 类类型
-9.4 对象(一)
-9.5 对象(二)
-9.6 类与对象的成员(一)
-9.7 类与对象的成员(二)
-9.8 类与对象的成员(三)
-9.9 继承(一)
-9.10 继承(二)
-9.11 继承(三)
-9.12 多态(一)
-9.13 多态(二)
-9.14 编程实践
-第九讲 类与对象--编程实践提交入口
-10.1 提纲
-10.2 四则运算符重载(一)
-10.3 四则运算符重载(二)
-10.4 关系与下标操作符重载
-10.5 赋值操作符重载(一)
-10.6 赋值操作符重载(二)
-10.7 赋值操作符重载(三)
-10.8 赋值操作符重载(四)
-10.9 赋值操作符重载(五)
-10.10 流操作符重载(一)
-10.11 流操作符重载(二)
-10.12 流操作符重载(三)
-10.13 操作符重载总结
-10.14 编程实践
-第十讲 操作符重载--编程实践提交入口
-11.1 提纲
-11.2 泛型编程概览
-11.3 异常处理机制(一)
-11.4 异常处理机制(二)
-11.5 运行期型式信息(一)
-11.6 运行期型式信息(二)
-11.7 模板与型式参数化
-11.8 题外话:术语翻译
-11.9 泛型编程实践(一)
-11.10 泛型编程实践(二)
-11.11 泛型编程实践(三)
-11.12 泛型编程实践(四)
-11.13 泛型编程实践(五)
-11.14 泛型编程实践(六)
-11.15 泛型编程实践(七)
-11.16 泛型编程实践(八)
-11.17 泛型编程实践(九)
-11.18 泛型编程实践(十)
-11.19 编程实践
-第十一讲 泛型编程--编程实践提交入口
-12.1 提纲
-12.2 程序执行环境(一)
-12.3 程序执行环境(二)
-12.4 程序执行环境(三)
-12.5 程序执行环境(四)
-12.6 输入输出(一)
-12.7 输入输出(二)
-12.8 文件系统
-12.9 设备
-12.10 库(一)
-12.11 库(二)
-12.12 makefile文件(一)
-12.13 makefile文件(二)
-12.14 makefile文件(三)
-12.15 编程实践
-第十二讲 Linux系统编程基础--编程实践提交入口
-13.01 提纲
-13.02 进程基本概念
-13.03 信号
-13.04 进程管理(一)
-13.05 进程管理(二)
-13.06 进程管理(三)
-13.07 进程间通信(一)
-13.08 进程间通信(二)
-13.09 进程间通信(三)
-13.10 进程间通信(四)
-13.11 进程池
-13.12 编程实践
-第十三讲 进程编程--编程实践提交入口
-14.1 提纲
-14.2 线程基本概念
-14.3 线程管理(一)
-14.4 线程管理(二)
-14.5 线程管理(三)
-14.6 线程管理(四)
-14.7 线程同步机制(一)
-14.8 线程同步机制(二)
-14.9 C++11线程库(一)
-14.10 C++11线程库(二)
-14.11 C++11线程库(三)
-14.12 C++11线程库(四)
-14.13 C++11线程库(五)
-14.14 编程实践
-第十四讲 线程编程--编程实践提交入口
-15.1 提纲
-15.2 Internet网络协议
-15.3 套接字(一)
-15.4 套接字(二)
-15.5 编程实践
-第十五讲 网络编程--编程实践提交入口