C++提供两种按条件指向的语句,一种是if语句,根据条件决定控制流,另一种是switch语句,根据计算得到的整型表达式的值来选择执行路径
1 if 语句
if语句的作用是判断一个指定条件是否为真,根据判断结果来决定是否执行另外一条语句,if语句可以有else分支,也可以没有
if (condition)
statement
else
statement2
if语句的condition必须用圆括号包围
condition可以是表达式,也可以是初始化了的变量
condition中的内容必须能转化为布尔类型
- 2 嵌套if语句
if (grade < 60)
lettergrade = scores[0];
else{
lettergrade = scores[(grade - 50)/10];
if (grade != 100)
if (grade % 10 > 7)
lettergrade += '+';
else if (grade % 10 < 3)
lettergrade += '=';
}
常见错误是忘记使用花括号来包围原本应该成块的语句
为了避免此类问题,有些编码风格要求在if或else之后必须写上花括号(对while和for也有类似要求),可以避免混乱也方便后续添加语句
- 悬垂else
else要与离它最近的尚未匹配的if进行匹配,从而消除程序的二义性
当if分支多于else分支,常常比较麻烦
- 使用花括号控制执行路径
2 switch语句
switch语句提供了一条便利的途径来在一些固定选项中做出选择
unsigned aCnt = 0, eCnt = 0, iCnt = 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标签值进行比较,匹配成功的化就开始执行,直到switch结尾或者遇到break语句为止
一般不要省略case分支后的break语句,如果没有最好需要注释说明程序逻辑
上述例子,如果没有break,则会出现跨越case标签,执行多个递增运算
case标签后面不一定给得换行,可以将标签写在一行里
switch(ch){
case 'a' : case 'e': case 'i': case 'o' : case 'u' :
++ vowelCt;
break;
}
- default标签
如果没有任何case标签匹配switch表达式的值,则可以执行default标签后面的语句
switch (ch){
case 'a' : case 'e': case 'i': case 'o' : case 'u' :
++ vowelCt;
break;
default:
++othercnt
break;
}
即使不准备在default标签下做任何工作,也可以定义空语句
- switch内部变量的定义
switch执行流程跨过某些case标签,需要注意变量作用域