3.4  布尔类型

在日常生活中,我们除了需要使用int类型的变量表示216路公交车;需要使用float类型的变量表示西红柿3.5元一斤,有时候还需要表示一种数据,那就是逻辑状态:

“这次的C++考试你过了没有?”

“他到底爱不爱我?”

这里的“过了没有”以及“爱不爱”都是表示一种逻辑判断。与之前我们用数值数据类型表示的公交车线路以及西红柿价格可以有多种取值不同,这种逻辑判断状态具有“非此即彼”的特殊性。对于考试状态,要么是“过了”,要么是“没过”,二者必选其一。正因为如此,在C++中,我们同样也使用一种特殊的数据类型——布尔类型——来表达这种“非此即彼”的逻辑判断状态。布尔类型的变量只可以被赋予值true或者false,分别表示逻辑的真与假、是与非。布尔类型的说明符是“bool”。C++标准并没有指定布尔类型数据的长度,在Visual C++中布尔类型占1个字节。例如:

// 布尔类型变量bPass,表示考试是否通过
// 赋值为true,表示考试通过
bool bPass = true;

与int等数值类型数据主要用于计算不同,布尔类型的数据主要用来保存逻辑判断的结果,或者是用于条件结构或者循环结构(在稍后的第4章将详细介绍)中,对程序的执行流程进行控制。例如:

cout<<"请输入你的分数:"<<endl;
// 保存输入分数的int类型变量
int nScore = ;
// 输入分数
cin>>nScore;
// 保存考试通过与否的bool类型变量
// 默认状态为false,表示没有通过
bool bPass = false;
// 用条件结构进行逻辑判断
// 判断输入的分数是否大于等于60
if(nScore >= )
{
// 保存逻辑判断的结果
// 如果输入的分数大于等于60,则赋值为true,
// 表示考试通过,否则继续保留其初始值false,表示没有通过
bPass = true;
} // 在条件结构中,根据bPass的取值不同,
// 对程序的执行路径进行控制
if(bPass)
{
// 如果bPass的值为true,输出考试通过
cout<<"恭喜,你通过了考试"<<endl;
}
else
{
// 如果bPass的值为false,输出考试未通过
cout<<"很遗憾,你没有通过考试"<<endl;
}

在这段代码中,bPass这个bool类型的变量,首先用于保存逻辑判断的结果,记录了输入的分数nScore是否大于等于60的逻辑判断结果。如果nScore大于等于60,bPass就被赋值为true,否则,继续保留它的初始值false,表示nScore没有大于等于60。这样,bPass这个bool类型的变量就保存了“nScore是否大于等于60”这个逻辑判断的结果。

用bool类型变量保存逻辑判断的结果,不仅仅是为了保存,更多的还是为了用在条件或者循环结构中对程序的执行流程进行控制。在其后的if条件结构中,bPass又被用作了条件判断的依据,如果bPass的值为true,则输出考试通过的提示,否则,就输出考试未通过的提示。这样,根据bPass这个bool类型变量的取值不同,我们的程序就有了不同的执行路径。

最佳实践:杜绝bool类型和整型的隐式转换

虽然bool类型变量只有true和false这两个逻辑值,但当其使用在一个需要数值算术值的地方时,bool类型变量的值将被隐式地转换成为一个整型数值。如果bool类型变量的值是false,则转换后参与运算的值就是0;反之就是1。反过来,如果我们把一个数值(整数或小数)赋值给一个bool类型变量,那么也会发生从数值数据到bool类型数值的隐式转换。数值0会被转换为为false,而其他任何非0的数值会被转换为true。例如:

bool a = ;     // 4被转换为true,a的值为true
int b = a; // a被转换为1,b的值为1
int c = a + b; // a被转换为1参与运算,c的值为2

这种转换发生得非常隐蔽,某些编译器甚至连警告信息都不会给出。而一旦代码的行为非常隐蔽,这就意味着其中很可能会隐藏着一些不容易被察觉的错误。所以我们应当尽量避免用数值为bool类型的变量赋值,或者是将bool类型的变量用于算术运算,杜绝这种“偷偷摸摸”的小动作的发生。

3.5  字符与字符串类型

“你的车牌号是多少?”

“陕A-82103”

我们知道,程序设计语言本质上是用来抽象、描述和表达现实世界的。面对现实世界中的各种数值数据(比如,表示公交车路线的216路,表示西红柿价格的3.5元一斤),我们可以用之前所介绍的数值数据类型定义变量(int nNo,float fPrice)来抽象和表达。除此之外,现实世界中还有另外一类数据——文字数据,比如上面例子中的车牌号“陕A-82103”就是一个文字数据。为了表达这一类文字数据,C++提供了字符类型和字符串类型两种数据类型专门用于抽象和表达文字数据。其中,字符类型用于表达单个的字符,比如‘A’、‘0’等等,而多个字符串联起来形成的字符串,我们则使用字符串类型来表达。

3.5.1 字符类型

在学习英语的时候,我们总是从ABC单个字母开始学习的,然后才能串联起来形成一句完整的话。而要想在C++中用字符串表达一个比较复杂的文字数据,我们同样也得从构成字符串的单个字符开始学起。在C++中,我们用字符类型来抽象和表达单个的常见字符,其类型说明符是“char”。例如:

// 定义字符类型变量cA,并用字符常量‘A’对其进行赋值
char cA = 'A'; // cA变量表示大写字母字符‘A’
char cB;
cB = '-'; // cB变量表示符号字符‘-’
// 输出字符‘A’
cout<<cA<<endl;

虽然字符类型的变量总是以字符的面目出现(赋值和输出),但在本质上,它其实可以看作是一种占用内存空间更少取值范围更小的整型数据类型。它只占用1 个字节的内存空间,相应的其取值范围也缩小为-128~127。当我们需要表达一个取值比较小的整数时,为了节省内存资源,我们可以使用char类型来表达。跟整型数据类型一样,字符类型也可以受到signed/unsigned关键字的修饰,形成有/无符号的字符类型。因此,char类型也可以参与算术运算。例如:

// 将大写字母字符‘A’对应的ASCII码值赋值给字符类型变量c
// 等价于char c = ‘A’;
char c = ;
// 变量t表示不可见的控制字符‘\t’,表示输出一个Tab控制
char t = '\t';
// 循环输出26个大写字母字符
for(int i = ; i < ; ++i)
{
// 输出c所代表的字符
cout<<c<<t; // 字符类型变量加1,使其成为ASCII表中的下一个字符
c = c + ;
}

知道更多:用wchar_t表示中文字符

因为char字符类型取值范围有限,只能用来表示有限的ANSCII字符表中的字符,包括常见的字母字符和控制字符等。而如果要表示更大范围内的字符,比如上面例子中的‘陕’这个中文字符,char就显得鞭长莫及了。为了弥补char类型的不足,C++提供了另外一种字符数据类型wchar_t,它占用2个字节的内存空间,取值范围更广,因而可以表示更大范围的字符,当然也包括中文字符了。例如,可以通过下面的方式来输出一个中文字符。不过这里需要注意的是,因为我们的代码中有扩展的中文字符,所以要求我们的代码文件使用UTF-8的编码格式进行保存。

// 定义一个wchar_t类型字符变量
// 并用一个中文字符对其赋值
wchar_t cChs = L'曾';
// 设置wcout输出对象的区域并输出中文字符
wcout.imbue ( locale ( "chs" ) );
wcout<<cChs<<endl;

这里值得提醒的是,字符常量或字符串常量前面的L前缀,表示对这里的字符或字符串采用wide-character字符集(宽字符集,通常是UNICODE字符集)对其进行编码。而如果不使用L前缀,则表示使用multibyte-character字符集(多字节字符集)对其进行编码。所以,如果我们要用某个字符或字符串常量对一个宽字符(wchar_t)或宽字符串(wstring)变量进行初始化或赋值时,我们应该在这个字符或字符串常量前加上L前缀。反之,如果是对char和string类型的变量进行初始化或赋值时,则不需要添加L前缀。

你好,C++(10)这次的C++考试你过了没有?C++中表示逻辑判断的布尔数据类型的更多相关文章

  1. 4.产生10个1-100的随机数,并放到一个数组中 (1)把数组中大于等于10的数字放到一个list集合中,并打印到控制台。 (2)把数组中的数字放到当前文件夹的numArr.txt文件中

    package cn.it.text; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayLis ...

  2. 【2018.10.10】[HNOI2008] GT考试(bzoj1009)

    10pts: 暴力枚举字符串,Hash判是否出现.(真会有人写么) 时间复杂度$O(10^n*n)$. 40pts: 学过OI的人都会写的dp 如果这道题的40pts($n\le 250000$)设成 ...

  3. 【编程题目】一串首尾相连的珠子(m 个),有 N 种颜色(N<=10),取出其中一段,要求包含所有 N 中颜色,并使长度最短。

    40.百度研发笔试题 2)一串首尾相连的珠子(m 个),有 N 种颜色(N<=10),设计一个算法,取出其中一段,要求包含所有 N 中颜色,并使长度最短.并分析时间复杂度与空间复杂度. 思路: ...

  4. 10.Find All Anagrams in a String(在一个字符串中发现所有的目标串排列)

    Level:   Easy 题目描述: Given a string s and a non-empty string p, find all the start indices of p's ana ...

  5. 使用Java语言实现,自己主动生成10个整数(1~100,求出生成数列中的最大值和最小值,不同意使用Arrays类的sort方法

    这是考察主要的java基础,没啥难点,直接上代码,近期在准备面试,所以做一些基础的面试题练练手 public class Demo1 { public static void main(String[ ...

  6. PMP认证考试的最新趋势及10大特征(针对改版后)

    我们都知道,今年PMP认证考试的教材已经改版了,最新版的内容是有不少的改动的,我们在了解PMP考试的时候,也要了解PMP考试的最新趋势,以便拿出应对的方法. 一.情景题更接地气 虽然PMP考试中继续保 ...

  7. 基于Web在线考试系统的设计与实现

    这是一个课程设计的文档,源码及文档数据库我都修改过了,貌似这里复制过来的时候图片不能贴出,下载地址:http://download.csdn.net/detail/sdksdk0/9361973   ...

  8. NOI前的考试日志

    4.14 网络流专项测试 先看T1,不会,看T2,仙人掌???wtf??弃疗.看T3,貌似最可做了,然后开始刚,刚了30min无果,打了50分暴力,然后接着去看T1,把序列差分了一下,推了会式子,发现 ...

  9. 2017/10 冲刺NOIP集训记录:暁の水平线に胜利を刻むのです!

    前几次集训都没有记录每天的点滴……感觉缺失了很多反思的机会. 这次就从今天开始吧!不能懈怠,稳步前进! 2017/10/1 今天上午进行了集训的第一次考试…… 但是这次考试似乎是近几次我考得最渣的一次 ...

随机推荐

  1. Struts2 cookie的存取

    /** * Cookieの追加 * @return * @throws Exception */ private void addCookie(String name,String value){ C ...

  2. 如果你不好好玩printf

    昨天在跟Fiona讨论printf导致程序Crash的问题,就花了点时间看看究竟什么情况下会这样,有兴趣的童鞋可以看看:) 只要是玩过C或者C++的童鞋们,对printf肯定是再熟悉不过了.下面有几个 ...

  3. Javascript之return

    做表单验证的时候,除了错误提示之外,还要做的一点就是避免表单提交. 如果避免表单提交呢? 有一个方法很简单,就是return 我们来看一下代码: $(".make_sure").c ...

  4. IIS6.0服务器搭建网站无法访问解决方法

    IIS6.0服务器搭建网站无法访问解决方法     IIS6.0服务器搭建网站无法访问解决方法很多朋友在用IIS6架网站的时候遇到不少问题,而这些问题有些在过去的IIS5里面就遇到过,有些是新出来的, ...

  5. Pet

    Problem Description One day, Lin Ji wake up in the morning and found that his pethamster escaped. He ...

  6. HDOJ 2053 Switch Game

    Problem Description There are many lamps in a line. All of them are off at first. A series of operat ...

  7. zoj 2404 最小费用流

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2404 #include <cstdio> #incl ...

  8. Xcode use Protocol buffer

    http://stackoverflow.com/questions/10277576/google-protocol-buffers-on-ios http://stackoverflow.com/ ...

  9. cookie操作大全

    JavaScript中的另一个机制:cookie,则可以达到真正全局变量的要求. cookie是浏览器 提供的一种机制,它将document 对象的cookie属性提供给JavaScript.可以由J ...

  10. HTML的简单介绍

    <html xmlns="http://www.w3.org/1999/xhtml"> <head><meta http-equiv="Co ...