}
复制代码
在这段代码中,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; ? ? // 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<
复制代码
虽然字符类型的变量总是以字符的面目出现(赋值和输出),但在本质上,它其实可以看作是一种占用内存空间更少取值范围更小的整型数据类型。它只占用1 个字节的内存空间,相应的其取值范围也缩小为-128~127。当我们需要表达一个取值比较小的整数时,为了节省内存资源,我们可以使用char类型来表达。跟整型数据类型一样,字符类型也可以受到signed/unsigned关键字的修饰,形成有/无符号的字符类型。因此,char类型也可以参与算术运算。例如:
?
复制代码
// 将大写字母字符‘A’对应的ASCII码值赋值给字符类型变量c
// 等价于char c = ‘A’;
char c = 65;
// 变量t表示不可见的控制字符‘\t’,表示输出一个Tab控制
char t = '\t';
// 循环输出26个大写字母字符
for(int i = 0; i < 26; ++i)
{
? ? // 输出c所代表的字符
? ? cout<
?
? ? // 字符类型变量加1,使其成为ASCII表中的下一个字符
? ? c = c + 1;
}
复制代码
知道更多:用wchar_t表示中文字符
?
因为cha