C语言的switch语句,switch语法结构c语言
c语言提供了多分支选择的switch语句。它的一般形式是:
Switch (expression) {case常量表达式1:语句1;打破;Case常量表达式2:语句2;打破;case常量表达式n:语句n;打破;默认:语句;打破;}
意思是:对一个表达式求值。并逐一比较以下常数表达式的值。当表达式的值等于一个常量表达式的值时,将执行下面的语句,然后继续执行case之后的所有语句,不做任何判断。如果表达式的值不同于case后的所有常量表达式,将执行default后的语句。处理流程图如下:
使用switch语句的规则是:
1.switch语句的判断条件可以接受int、byte、char、short、enumeration,但不能接受其他类型。
2.case后的常量表达式的值不能相同,否则会出错。
3.case之后允许多条语句,不需要用{}括起来。
4.可以更改每个case和default子句的顺序,而不会影响程序的执行结果。
5.默认情况下,如果没有匹配的案例,则执行它。默认是不必要的。
6.如果没有break语句:首先,将在所有case语句中搜索符合条件的语句。如果找到,每条语句将从语句顺序往下执行;如果找不到,就从第一段开始,然后按降序执行每段语句。
7.如果有break语句:找到满足条件的case语句并执行。否则,将执行默认语句。
例如,下面的例子:
# include stdio . h int main(void){ inta;Printf(请输入一个整数:\ n );scanf(%d ,switch(a){ case 1:printf( Monday \ n );案例2:printf( Tuesday \ n );case3: printf(星期三\ n );case4: printf(星期四\ n );case 5:printf( Friday \ n );case6: printf(星期六\ n );case 7:printf( Sunday \ n );默认值:printf(输入错误\ n );}系统(暂停);return0}
运行结果:
这个程序需要输入一个数字和输出一个英文单词。但输入3后,执行case3及所有后续语句,输出星期三及后续所有单词。当然,这是不可取的。为什么会这样?这正好反映了switch语句的一个特点。在switch语句中,“case常量表达式”只相当于一个语句标签。当表达式的值等于一个标签时,将在该标签处执行,但在标签语句执行后不能自动跳出整个switch语句,所以看起来后续所有case语句都将继续执行。这和前面介绍的if语句完全不同,要特别注意。
为了避免上述情况,我们需要使用break语句,专门用于跳出switch语句。break语句只有关键字break,没有参数。后面会详细描述。修改示例的程序,在每个case语句后添加一个break语句,这样就可以在每次执行后跳出switch语句,从而避免输出不必要的结果。
修改后的代码:
# include stdio . h int main(void){ inta;Printf(请输入一个整数:\ n );scanf(%d ,switch(a){ case 1:printf( Monday \ n );打破;案例2:printf( Tuesday \ n );打破;case3: printf(星期三\ n );打破;case4: printf(星期四\ n );打破;case 5:printf( Friday \ n );打破;case6: printf(星期六\ n );打破;case 7:printf( Sunday \ n );打破;默认值:printf(输入错误\ n );}系统(暂停);return0}
执行结果:
可以看到运行结果正常。
switch语句不是必不可少的,显然可以用一组if来代替.否则如果.否则如果.else,但是一方面,使用switch语句会让代码更清晰;另一方面,有时编译器会整体优化switch语句,使其比等价的if/else语句生成的目标代码更高效。
使用switch语句时,请注意以下几点:
1.case后面必须跟一个常量表达式,因为这个值必须在编译时计算。
2.在C语言中,浮点型无法准确比较等式和不等式。所以C语言规定跟在case后面的常量表达式的值必须是可以精确比较的整数或字符类型。
3.进入case后,如果没有遇到break语句,就会一直执行下去,case或者default下面的其他语句也会执行下去,直到遇到break或者整个switch语句块的结尾。通常,每个case后面都有一个break语句,但有时这个特性会被故意利用而不中断。
下面是使用switch语句的三种情况。
1.标准类型(case后跟break语句)
# include stdio . h int main(void){ inti=3;开关(i) { case1: printf(%d\n ,1);打破;情况2: printf(%d\n ,2);打破;情况3: printf(%d\n ,3);打破;默认值:printf(%s\n , default );打破;}系统(暂停);return0}
运行结果:
2.特殊类型1(没有完整的break语句,可以完成一些特殊应用)
# include stdio . h int main(void){ int year=2014;int month=6;intdayswitch(月){案例1:案例3:案例5:案例7:案例8:案例10:案例12:日=31;打破;情况2:天=28;打破;情况4:情况6:情况9:情况11:天=30;打破;} printf(%d\n ,天);系统(“暂停”);return0}
运行结果:
3.特殊类型2(默认位置)
# include stdio . h int main(void){ inti=1;开关(i) { case1: printf(%d\n ,1);默认值:printf(%s\n , default );情况2: printf(%d\n ,2);打破;情况3: printf(%d\n ,3);打破;}系统(暂停);return0}
运行结果:
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。