
2.7 基本控制语句
C++程序设计中基本控制结构包括顺序结构、选择结构和循环结构,它们都是通过控制语句实现的。其中顺序结构不需要特殊的语句,选择结构需要通过条件语句实现,循环结构需要用循环语句实现,除此之外,有时程序需要无条件地执行一些操作,这时需要用到转移语句,接下来详细讲解这3种基本控制语句。
2.7.1 条件语句
条件语句可以给定一个判断条件,并在程序执行过程中判断该条件是否成立,根据判断结果执行不同的操作,从而改变代码的执行顺序,实现更多的功能。例如,想给好友发一封电子邮件,必须将账号密码都输入正确才能进行相关操作,否则登录失败需要重新输入,具体如图2.24所示。
C++中条件语句有if语句、if-else语句、if-else if-else语句、switch语句。接下来,本节将针对这些条件语句进行逐步讲解。

图2.24 电子邮箱登录界面
1. if语句
if语句用于在程序中有条件地执行某些语句,其语法格式如下:

如果条件表达式的值为真,则执行其后面的语句,否则不执行该语句。if语句的执行流程,如图2.25所示。

图2.25 if语句流程图
2. if-else语句
if-else语句用于根据条件表达式的值决定执行哪块代码,其语法格式如下:

如果条件表达式的值为真,则执行其后面的语句块1,否则执行语句块2。if-else语句的执行流程,如图2.26所示。

图2.26 if-else语句流程图
3. if-else if-else语句
if-else if-else语句用于进行多重判断。例如,参加高考的考生填报志愿,如果分数超过一本分数线,就可填报一本的学校;如果没有超过一本分数线,就来判断分数是不是超过二本分数线,超过就可填报二本的学校;如果二本的分数线也没有超过,就只能填报三本或大专的学校。其语法格式如下:

当执行该语句时,依次判断条件表达式的值,当出现某个表达式的值为真时,则执行其对应的语句,然后跳出if-else if-else语句继续执行该语句后面的代码。如果所有表达式均为假,则执行else后面的语句块n。if-else if-else语句的执行流程,如图2.27所示。

图2.27 if-else if-else语句流程图
接下来演示if-else if-else语句的用法,如例2-14所示。
例2-14

运行结果如图2.28所示。

图2.28 例2-14运行结果
在例2-14中,第7行中的cin为标准库函数中的一个对象,它用来接收键盘输入,其使用方法与cout相反,cin后面加提取运算符“>>”,要注意该提取运算符“>>”与cout的插入运算符“<<”是正好相反的。本程序的功能是输入成绩,并输出成绩对应的等级。当程序运行输入s=58.9时,程序依次判断表达式的真假,先执行表达式s>=90,此时结果为假,则跳过其后面的语句块,转而执行表达式s>=80,此时结果仍为假,则继续跳过其后面语句块,以此类推。显然所有的条件表达式结果都为假,因此程序将执行else后面的语句块,程序最终输出“不及格”。
4. switch语句
switch语句用于根据表达式的值确定在几种不同值时执行不同的语句块,其语法格式如下:

接下来演示switch语句的用法,如例2-15所示。
例2-15

运行结果如图2.29所示。

图2.29 例2-15运行结果
在例2-15中,第8行switch检查grade的值是否与某个case中的值相同,假如相同,那么执行该case中的语句。程序运行输入“C”,该值被保存在grade变量中,第8行的switch检查grade的值,发现与第16行的case值相等,因此执行第17行,输出“分数段为70~80”,然后执行第18行,遇到break语句,退出switch语句,程序转到第28行来执行。
2.7.2 循环语句
循环结构用于重复执行某一语句块,在C++中提供了3种形式的循环语句:while循环语句、do-while循环语句和for循环语句。
1. while循环语句
在while循环语句中,当条件表达式为真时,就重复执行循环体语句;当条件为假时,就结束循环,其语法格式如下:

若while循环的循环体只有一条语句,则可以省略左右大括号。while的循环体是否执行,取决于条件表达式是否为真,当条件表达式为真时,循环体就会被执行。循环体执行完毕后继续判断条件表达式,如果条件表达式为真,则会继续执行,直到条件表达式为假时,整个循环过程才会执行结束。while循环的执行流程,如图2.30所示。

图2.30 while循环流程图
接下来演示while循环语句的用法,如例2-16所示。
例2-16

运行结果如图2.31所示。

图2.31 例2-16运行结果
在例2-16中,当i=1时,i<101,此时执行循环体语句,sum为1,i为2。当i=2时,i<101,此时执行循环体语句,sum为3,i为3。以此类推,直到i=101,不满足循环条件,此时程序执行第11行代码。
2. do-while循环语句
do-while循环语句是非零次循环结构,即至少执行一次循环体。执行过程是先执行循环体结构,然后判断条件表达式,若条件表达式为真,则继续执行循环体;若条件表达式为假,则终止循环。在日常生活中,并不难找到do-while循环的影子。例如,在利用提款机提款前,应先进入输入密码的画面,允许用户输入3次密码,如果3次都输入错误,即会将银行卡吞掉,其程序的流程就是利用do-while循环设计而成的。其语法格式如下:

do-while语句与while语句有一个明显的区别是do-while语句的条件表达式后面必须有一个分号,用来表明循环结束。do-while循环的执行流程如图2.32所示。

图2.32 do-while循环流程图
接下来演示do-while循环语句的用法,如例2-17所示。
例2-17

运行结果如图2.33所示。

图2.33 例2-17运行结果
在例2-17中,程序执行完循环体后,sum为1,i为2,接着判断i是否小于101,此时i小于101,则执行循环体。直到i为101,不满足循环条件,此时程序执行第11行代码。
3. for循环语句
for循环是最常见的循环结构,而且其语句更为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定的情况,完全可以代替while循环语句,其语法格式如下:

其中,表达式1常用于初始化循环变量;表达式2是循环条件表达式,当条件为真时,将执行循环体语句,当条件为假时,结束循环;表达式3在每次执行循环体后执行,它一般用于为循环变量增量,for循环的执行流程如图2.34所示。
接下来演示for循环语句的用法,如例2-18所示。

图2.34 for循环流程图
例2-18

运行结果如图2.35所示。

图2.35 例2-18运行结果
在例2-18中,先执行i=1,再判断i是否小于101,此时i小于101,执行循环体,再执行i++,此时i为2,判断i是否小于101,此时i小于101,执行循环体,以此类推,直到i为101,不满足循环条件,此时程序执行第10行代码。
C++中的循环语句也支持嵌套使用,即多重循环,3种格式的循环语句可以根据需求相互嵌套。
2.7.3 转移语句
转移语句使函数内的程序无条件地改变控制权,包括break、continue和goto语句。由于这些语句是无条件转移,因此常常与if等条件语句配合使用。
1. break语句
break语句可以用在switch结构和循环结构中,用于强制退出结构,转而执行该结构后面的语句。
2. continue语句
continue语句只能用在循环结构中,用于终止本次循环,转而执行下一次循环。
3. goto语句
goto语句可以用在程序中的任何位置,只能从结构里向结构外跳转,反之则不行。由于大量使用goto语句会大大降低程序的可读性,因此在程序设计中建议尽量不用goto语句。
接下来演示break语句和continue语句的用法,如例2-19所示。
例2-19

运行结果如图2.36所示。

图2.36 例2-19运行结果
在例2-19中,程序的功能是计算并输出用户从键盘输入的正数的平均值(0是输入结束标志)。程序运行时,当第二次输入-1时,对应程序中第16~20行代码,continue的作用仅仅是结束本次循环。当第三次输入0时,对应程序中第11~15行代码,break的作用是结束整个循环。