山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省
if语句只有两个分支可供选择,而实际问题中常常需要用到多分支的选择。例如,学生成绩分类(85分以上为A等,70 ~ 84分为B等,60 ~ 69分为C等),人口统计分类(按年龄分为老、中、青、少、儿童),工资统计分类,银行存款分类等。当然这些都可以用嵌套的if语句来处理,但如果分支较多,则嵌套的if语句层数多,程序冗长而且可读性降低。C语言提供switch语句直接处理多分支选择。switch语句是多分支选择语句。
例题:
要求按照考试成绩的等级输出百分制分数段,A等为85分以上,B等为70 ~84分,C等为60 ~69分,D等为60分以下。成绩的等级由键盘输入。解题思路:这是一个多分支选择问题,根据百分制分数将学生成绩分为4个等级,如果用if语句来处理至少要用3层嵌套的if,进行3次检查判断。用switch语句,进行一次检查即可得到结果。
编写程序:
运行结果 :
从键盘输入大写字母A,按回车键,程序输出对应的分数段。
程序分析:
等级grade定义为字符变量,从键盘输入一个大写字母,赋给变量grade , switch得到grade的值并把它和各case中给定的值( ' A ',' B ',' C ',D '之一)相比较,如果和其中之一相同(称为匹配),则执行该case后面的语句(即printf语句)。输出相应的信息。如果输入的字符与A ',' B ',C,,D '都不相同,就执行default后面的语句,输出“输入数据有错”的信息。
注意在每个case后面后的语句中,最后都有一个break语句,它的作用是使流程转到switch语句的末尾(即右花括号处)。
可以看到,switch语句的作用是根据表达式的值,使流程跳转到不同的语句。switch语句的一般形式如下:
switch(表达式)
{
case 常量1:语句1
case 常量2:语句2
case 常量n:语句n
default : 语句n+1
}
说明:
( 1 )上面switch一般形式中括号内的“表达式”,其值的类型应为整数类型(包括字符型)。
( 2 ) switch下面的花括号内是一个复合语句。这个复合语句包括若干语句,它是switch语句的语句体。语句体内包含多个以关键字case开头的语句行和最多一个以default开头的行。case后面跟一个常量(或常量表达式),如:case 'A’,它们和default都是起标号( label,或称标签、标记)的作用,用来标志一个位置。执行switch语句时,先计算switch后面的“表达式”的值,然后将它与各case标号比较,如果与某一个case标号中的常量相同,流程就转到此case标号后面的语句。如果没有与switch表达式相匹配的case常量,流程转去执行default标号后面的语句。
( 3 )可以没有default标号,此时如果没有与switch表达式相匹配的case常量,则不执行任何语句,流程转到switch语句的下一个语句。
( 4 )各个case标号出现次序不影响执行结果。例如,可以先出现default标号,再出现“case' D '…”然后是“case ' B’:…”。
( 5 )每一个case常量必须互不相同;否则就会出现互相矛盾的现象(对switch表达式的同一个值,有两种或多种执行方案)。
( 6 ) case标号只起标记的作用。在执行switch语句时,根据switch表达式的值找到匹配的入口标号,并不在此进行条件检查,在执行完一个case标号后面的语句后,就从此标号开始执行下去,不再进行判断。例如在例题中,如果在各case子句中没有break语句,将连续输出:
Your score : 85 ~ 100
70 ~ 84
60 ~ 69
< 60
enter data error !
注意:一般情况下,在执行一个case子句后,应当用break语句使流程跳出switch结构,即终止switch语句的执行。最后一个case子句(今为default子句)中可不必加break语句,因为流程已到了switch结构的结束处。
例如:
case ' A’:
case ' B ' :
case ' C ' : printf ( " > 60 \ n " ) ; break ;
当grade的值为' A ',' B ',' C '时都执行同一组语句,输出“> 60”,然后换行。