第五章_语句_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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值