当前课程知识点:基于Linux的C++ >  第二讲 程序控制结构 >  2.3 布尔数据 >  LinuxCPP0203

返回《基于Linux的C++》慕课在线视频课程列表

LinuxCPP0203在线视频

LinuxCPP0203

下一节:LinuxCPP0204

返回《基于Linux的C++》慕课在线视频列表

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整除

这个就是我们最后的计算式子

基于Linux的C++课程列表:

第一讲 C/C++基本语法元素

-1.1 提纲

--LinuxCPP0101

-1.2 程序设计的基本概念

--LinuxCPP0102

-1.3 简单C/C++程序介绍

--LinuxCPP0103

-1.4 程序设计的基本流程

--LinuxCPP0104

-1.5 基本语法元素

--LinuxCPP0105

-1.6 程序设计风格

--LinuxCPP0106

-1.7 编程实践

--LinuxCPP0107

-第一讲 C/C++基本语法元素--编程实践提交入口

第二讲 程序控制结构

-2.1 提纲

--LinuxCPP0201

-2.2 结构化程序设计基础

--LinuxCPP0202

-2.3 布尔数据

--LinuxCPP0203

-2.4 分支结构

--LinuxCPP0204

-2.5 break语句

--LinuxCPP0205

-2.6 循环结构

--LinuxCPP0206

-2.7 编程实践

--LinuxCPP0207

-第二讲 程序控制结构--编程实践提交入口

第三讲 函数

-3.1 提纲

--LinuxCPP0301

-3.2 函数声明、调用与定义

--LinuxCPP0302

-3.3 函数调用栈框架

--LinuxCPP0303

-3.4 编程实践

--LinuxCPP0304

-第三讲 函数--编程实践提交入口

第四讲 算法

-4.1 提纲

--LinuxCPP0401

-4.2 算法概念与特征

--LinuxCPP0402

-4.3 算法描述

--LinuxCPP0403

-4.4 算法设计与实现

--LinuxCPP0404

-4.5 递归算法(一)

--LinuxCPP0405

-4.6 递归算法(二)

--LinuxCPP0406

-4.7 容错与计算复杂度

--LinuxCPP0407

-4.8 编程实践

--LinuxCPP0408

-第四讲 算法--编程实践提交入口

第五讲 程序组织与开发方法

-5.1 提纲

--LinuxCPP0501

-5.2 库与接口

--LinuxCPP0502

-5.3 随机数库(一)

--LinuxCPP0503

-5.4 随机数库(二)

--LinuxCPP0504

-5.5 作用域与生存期

--LinuxCPP0505

-5.6 典型软件开发流程(一)

--LinuxCPP0506

-5.7 典型软件开发流程(二)

--LinuxCPP0507

-5.8 编程实践

--LinuxCPP0508

-第五讲 程序组织与开发方法--编程实践提交入口

第六讲 复合数据类型

-6.1 提纲

--LinuxCPP0601

-6.2 字符

--LinuxCPP0602

-6.3 数组(一)

--LinuxCPP0603

-6.4 数组(二)

--LinuxCPP0604

-6.5 结构体

--LinuxCPP0605

-6.6 编程实践

--LinuxCPP0606

-第六讲 复合数据类型--编程实践提交入口

第七讲 指针与引用

-7.1 提纲

--LinuxCPP0701

-7.2 指针基本概念

--LinuxCPP0702

-7.3 指针与函数

--LinuxCPP0703

-7.4 指针与复合数据类型(一)

--LinuxCPP0704

-7.5 指针与复合数据类型(二)

--LinuxCPP0705

-7.6 字符串

--LinuxCPP0706

-7.7 动态存储管理(一)

--LinuxCPP0707

-7.8 动态存储管理(二)

--LinuxCPP0708

-7.9 引用

--LinuxCPP0709

-7.10 编程实践

--LinuxCPP0710

-第七讲 指针与引用--编程实践提交入口

第八讲 链表与程序抽象

-8.1 提纲

--LinuxCPP0801

-8.2 数据抽象(一)

--LinuxCPP0802

-8.3 数据抽象(二)

--LinuxCPP0803

-8.4 链表(一)

--LinuxCPP0804

-8.5 链表(二)

--LinuxCPP0805

-8.6 链表(三)

--LinuxCPP0806

-8.7 链表(四)

--LinuxCPP0807

-8.8 函数指针(一)

--LinuxCPP0808

-8.9 函数指针(二)

--LinuxCPP0809

-8.10 抽象链表(一)

--LinuxCPP0810

-8.11 抽象链表(二)

--LinuxCPP0811

-8.12 编程实践

--LinuxCPP0812

-第八讲 链表与程序抽象--编程实践提交入口

第九讲 类与对象

-9.1 提纲

--LinuxCPP0901

-9.2 程序抽象与面向对象

--LinuxCPP0902

-9.3 类类型

--LinuxCPP0903

-9.4 对象(一)

--LinuxCPP0904

-9.5 对象(二)

--LinuxCPP0905

-9.6 类与对象的成员(一)

--LinuxCPP0906

-9.7 类与对象的成员(二)

--LinuxCPP0907

-9.8 类与对象的成员(三)

--LinuxCPP0908

-9.9 继承(一)

--LinuxCPP0909

-9.10 继承(二)

--LinuxCPP0910

-9.11 继承(三)

--LinuxCPP0911

-9.12 多态(一)

--LinuxCPP0912

-9.13 多态(二)

--LinuxCPP0913

-9.14 编程实践

--LinuxCPP0914

-第九讲 类与对象--编程实践提交入口

第十讲 操作符重载

-10.1 提纲

--LinuxCPP1001

-10.2 四则运算符重载(一)

--LinuxCPP1002

-10.3 四则运算符重载(二)

--LinuxCPP1003

-10.4 关系与下标操作符重载

--LinuxCPP1004

-10.5 赋值操作符重载(一)

--LinuxCPP1005

-10.6 赋值操作符重载(二)

--LinuxCPP1006

-10.7 赋值操作符重载(三)

--LinuxCPP1007

-10.8 赋值操作符重载(四)

--LinuxCPP1008

-10.9 赋值操作符重载(五)

--LinuxCPP1009

-10.10 流操作符重载(一)

--LinuxCPP1010

-10.11 流操作符重载(二)

--LinuxCPP1011

-10.12 流操作符重载(三)

--LinuxCPP1012

-10.13 操作符重载总结

--LinuxCPP1013

-10.14 编程实践

--LinuxCPP1014

-第十讲 操作符重载--编程实践提交入口

第十一讲 泛型编程

-11.1 提纲

--LinuxCPP1101

-11.2 泛型编程概览

--LinuxCPP1102

-11.3 异常处理机制(一)

--LinuxCPP1103

-11.4 异常处理机制(二)

--LinuxCPP1104

-11.5 运行期型式信息(一)

--LinuxCPP1105

-11.6 运行期型式信息(二)

--LinuxCPP1106

-11.7 模板与型式参数化

--LinuxCPP1107

-11.8 题外话:术语翻译

--LinuxCPP1108

-11.9 泛型编程实践(一)

--LinuxCPP1109

-11.10 泛型编程实践(二)

--LinuxCPP1110

-11.11 泛型编程实践(三)

--LinuxCPP1111

-11.12 泛型编程实践(四)

--LinuxCPP1112

-11.13 泛型编程实践(五)

--LinuxCPP1113

-11.14 泛型编程实践(六)

--LinuxCPP1114

-11.15 泛型编程实践(七)

--LinuxCPP1115

-11.16 泛型编程实践(八)

--LinuxCPP1116

-11.17 泛型编程实践(九)

--LinuxCPP1117

-11.18 泛型编程实践(十)

--LinuxCPP1118

-11.19 编程实践

--LinuxCPP1119

-第十一讲 泛型编程--编程实践提交入口

第十二讲 Linux系统编程基础

-12.1 提纲

--LinuxCPP1201

-12.2 程序执行环境(一)

--LinuxCPP1202

-12.3 程序执行环境(二)

--LinuxCPP1203

-12.4 程序执行环境(三)

--LinuxCPP1204

-12.5 程序执行环境(四)

--LinuxCPP1205

-12.6 输入输出(一)

--LinuxCPP1206

-12.7 输入输出(二)

--LinuxCPP1207

-12.8 文件系统

--LinuxCPP1208

-12.9 设备

--LinuxCPP1209

-12.10 库(一)

--LinuxCPP1210

-12.11 库(二)

--LinuxCPP1211

-12.12 makefile文件(一)

--LinuxCPP1212

-12.13 makefile文件(二)

--LinuxCPP1213

-12.14 makefile文件(三)

--LinuxCPP1214

-12.15 编程实践

--LinuxCPP1215

-第十二讲 Linux系统编程基础--编程实践提交入口

第十三讲 进程编程

-13.01 提纲

--LinuxCPP1301

-13.02 进程基本概念

--LinuxCPP1302

-13.03 信号

--LinuxCPP1303

-13.04 进程管理(一)

--LinuxCPP1304

-13.05 进程管理(二)

--LinuxCPP1305

-13.06 进程管理(三)

--LinuxCPP1306

-13.07 进程间通信(一)

--LinuxCPP1307

-13.08 进程间通信(二)

--LinuxCPP1308

-13.09 进程间通信(三)

--LinuxCPP1309

-13.10 进程间通信(四)

--LinuxCPP1310

-13.11 进程池

--LinuxCPP1311

-13.12 编程实践

--LinuxCPP1312

-第十三讲 进程编程--编程实践提交入口

第十四讲 线程编程

-14.1 提纲

--LinuxCPP1401

-14.2 线程基本概念

--LinuxCPP1402

-14.3 线程管理(一)

--LinuxCPP1403

-14.4 线程管理(二)

--LinuxCPP1404

-14.5 线程管理(三)

--LinuxCPP1405

-14.6 线程管理(四)

--LinuxCPP1406

-14.7 线程同步机制(一)

--LinuxCPP1407

-14.8 线程同步机制(二)

--LinuxCPP1408

-14.9 C++11线程库(一)

--LinuxCPP1409

-14.10 C++11线程库(二)

--LinuxCPP1410

-14.11 C++11线程库(三)

--LinuxCPP1411

-14.12 C++11线程库(四)

--LinuxCPP1412

-14.13 C++11线程库(五)

--LinuxCPP1413

-14.14 编程实践

--LinuxCPP1414

-第十四讲 线程编程--编程实践提交入口

第十五讲 网络编程

-15.1 提纲

--LinuxCPP1501

-15.2 Internet网络协议

--LinuxCPP1502

-15.3 套接字(一)

--LinuxCPP1503

-15.4 套接字(二)

--LinuxCPP1504

-15.5 编程实践

--LinuxCPP1505

-第十五讲 网络编程--编程实践提交入口

课程文档

-课程PDF文件

LinuxCPP0203笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。