5.3 条件语句
5.3 条件语句
有两种条件语句
if
语句switch
语句
5.3.1 if 语句
if
语句的语法形式是
if (condition)
statement;
if else
语句的形式是
if (condition)
statement1;
else
statement2;
使用 if else 语句
// 如果 grade 的结果小于 60,对应的字母是 F;否则计算其下标
const vector<string> socres = {"F","D","C","B","A","A++"};
string lettergrade;
if (grade < 60)
lettergrade = socres[0];
else
lettergrade = socres[(grade - 50) / 10];
嵌套 if 语句
if (grade < 60)
lettergrade = socres[0];
else{
lettergrade = socres[(grade - 50) / 10];
if (grade != 100)
if (grade % 10 > 7)
lettergrade += '+';
else if (grade % 10 < 3)
lettergrade += '-';
}
注意使用花括号
悬垂 else(dangling else)
确定某个给定的else
是和哪个版本if
匹配?
使用花括号控制执行路径
5.3.2 switch 语句
提供了一条便利的途径使得我们能够在若干固定选项中做出选择。
// 统计元音字母出现的次数
unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0; uCnt = 0;
char ch;
while (cin >> ch){
switch (ch){
case 'a': ++aCnt; break;
case 'e': ++eCnt; break;
case 'i': ++iCnt; break;
case 'o': ++oCnt; break;
case 'u': ++uCnt; break;
}
}
switch
语句首先对括号里的表达式求值,表达式的值转换成整数类型,然后与每个case
标签的值比较,如果表达式和某个case
标签的值匹配成功,程序从该标签之后的第一条语句开始执行,直到到达switch
的结尾或者是遇到一条break
语句为止。
case
关键字和它对应的值一起被称为case
标签。case
标签必须是整型常量表达式。
switch 内部的控制流
如果某个case
标签匹配成功,将从该标签开始往后顺序执行所有case
分支,除非程序显式地中断了这一过程,否则直到switch
的结尾处才会停下来。
unsigned wowelCnt = 0;
switch (ch){
// 出现了 a、e、i、o 或 u 中的任意一个都会将 vowelCnt 的值加 1
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
++vowelCnt;
break;
}
漏写 break 容易引发缺陷
default 标签
如果没有任何一个case
标签能匹配上switch
表达式的值,程序将执行紧跟在default
标签后面的语句。
即使不准备在default
标签下做任何工作,也要定义一个default
标签。
switch 内部的变量定义
如果在某处一个带有初值的变量位于作用于之外,在另一处该变量位与作用域之内,则从迁移处跳转到后一处的行为是非法行为。
如果需要为某个case
分支定义并初始化一个变量,应该把变量定义在块内,从而确保后面的所有case
标签都在变量的作用于之外。
case true:
{
string file_name = get_file_name();
}
break;
case false:
if (file_name.empty()) // 错误:file_name 不在作用域之外
break;