第六章 分支语句和逻辑运算符
6.1. if语句
if(test-condition)
statement;
if(test-condition)
statement1;
else
statement2;
6.2. 逻辑表达式
6.2.1. 逻辑OR运算符:||
if(test-condition1 || test-condition2)
statement;
有一个为真,那么表达式就会为真。如果左边的为真,那么就不会去判定右边的表达式。
6.2.2. 逻辑AND运算符:&&
if(test-condition1 && test-condition2)
statement;
两个都真,表达式才会真。
6.2.3. 用&&来设置取值范围
if(age > 17 && age < 35);
6.2.4. 逻辑NOT运算符:!
if(!(x > 5));
6.2.5. 逻辑运算符细节
逻辑或和逻辑与运算符的优先级都低于关系运算符
也就是说
x > 5 && x < 10
将被解释为
(x > 5) && (x < 10)
另一方面,!运算符的优先级高于所有的关系运算符和算数运算符。因此,如果要对表达式求反,那么必须用括号把它括起来
!(x > 5) // is iit false that x is greater than 5
!x > 5 // is !x greater than 5
第二个表达式总是为false,因为!x的值只能为true或false,它们将被转换为1或0
逻辑与运算符的优先级高于逻辑或的运算符
age > 30 && age < 45 || weight > 300
将被解释为
(age > 30 && age < 45) || weight > 300
6.2.6. 其他表示方式
在C++当中,还能用 and or not来表达这三个表达式
6.3. 字符函数库 cctype
C++从C语言继承了一个与字符相关的软件包,可以简化比如确定字符是否为大写字母、数字、标点符号等工作,这些函数的原型是在头文件cctype(老式风格为ctype.h)中定义的。
函数名称 返回值
isalnum() 如果参数是字母数字,即字母或者数字,函数返回true
isalpha() 如果参数是字母,函数返回true
iscntrl() 如果参数是控制字符,函数返回true
isdigit() 如果参数是数字(0-9),函数返回true
isgraph() 如果参数是除空格之外的打印字符,函数返回true
islower() 如果参数是小写字母,函数返回true
isprint() 如果参数是打印字符(包括空格),函数返回true
ispunct() 如果参数是标点符号,函数返回true
isspace() 如果参数是标准空白字符,如空格、换行符、水平或垂直制表符,函数返回true
isupper() 如果参数是大写字母,函数返回true
isxdigit() 如果参数是十六进制数字,即0-9、a-f、A-F,函数返回true
tolower() 如果参数是大写字符,返回其小写,否则返回该参数
toupper() 如果参数是小写字符,返回其大写,否则返回该参数
6.4. ? : 运算符
expression1 ? expression2 : expression3;
5 > 3 ? 10 : 12;
// 如果5大于3,那么表达式的值为10,否则为12。
6.5. switch语句
switch(integer-expression){
case label1:
statement(s);
case label2:
statement(s);
...
default:
statement(s);
}
switch(choice){
case 1:
cout << "1" << endl;
break;
case 2:
cout << "2" << endl;
break;
default:
cout << "default" << endl;
}
6.5.1. 将枚举变量用作标签
通常,cin无法识别枚举类型。因为程序要求用户选择选项时输入一个整数。当switch语句将int值和枚举量进行比较时,会将枚举量提升为int。另外,在while循环条件当中,也会将枚举量提升为int类型。
6.5.2. switch 和if else
switch不是用来处理取值范围的。
if else可以。
6.6. break和continue语句
break跳过所有循环
continue跳过本次循环
6.7. 读取数字的循环
#include <iostream>
const int MAX = 5;
using namespace std;
int main(){
double fish[MAX];
cout << "please enter the weights of your fish.\n";
cout << "you may enter up to " << MAX
<< " fish <q to terminate>.\n";
cout << "fish #1: ";
int i = 0;
while(i < MAX && cin >> fish[i]){
if(++i < MAX) cout << "fish #" << i + 1 << ": ";
}
double total = 0.0;
for(int j = 0; j < i; j++) total += fish[j];
if(i == 0) cout << "no fish\n";
else cout << total / i << " = average weight of "
<< i << " fish\n";
cout << "done.\n";
return 0;
}
6.8. 简单文件输入/输出
6.8.1. 文件I/O和文本文件
cin输入时,程序将输入视为一系列的字节,每个字节都被解释为字符编码。不管目标数据类型是什么,一开始都是字符数据。然后cin对象负责将字符数据,也就是文本转化为其他类型。
如果在输入的时候,输入:
38.5 19.2
char ch;
cin >> ch;
这个会在ch当中存储第一个字符,也就是3
int n;
cin >> n;
这种情况下,cin会不断读取,知道遇到非数字字符。也就是,它将读取3和8。n中保存的将是38这个整数数值。
double x;
cin >> x;
这种情况下,会不断读取,直到遇到第一个不属于浮点数的字符。也就是说,cin读取3、8、句点和5。那么x中保存的将是38.5。
char word[50];
cin >> word;
在这种情况下,word数组将会保存38.5和一个空字符。
char word[50];
cin.getline(word, 50);
这种情况下,cin将不断读取,直到遇到换行符。所有字符都将被存储到数组word中,并在末尾加上一个空字符。换行符被丢弃,输入队列中的下一个字符是下一行中的第一个字符。