3.3.5 switch语句
switch 语句也称开关语句,它用于测试某一个变量具有多个值时所执行的动作。分为两类:一类是简单switch语句;另一类是switch语句中又有一个switch语句,即switch语句嵌套。
(1)简单switch语句
switch语句的格式:
switch( 表达式 ) {case 常量表达式1: 语句1; case 常量表达式2: 语句2; …… case 常量表达式n: 语句n; default : 语句n+1; }
功能:首先计算表达式的值,然后依次与常量表达式i(i=1,2, …, n)比较,若表达式的值与常量表达式j相等,则从常量表达式j处开始执行(执行入口),流程控制转移到下一个case子句继续执行,直到switch语句结束。若所有的常量表达式i(i=1,2, …, n)均不等于表达式,则从default处开始执行,switch语句流程图如图3.6所示。
图3.6 switch语句流程图
注意:
① switch后面括号中的表达式可以是整型、整型长量表达式或字符型表达式。
② 常量表达式中不能出现变量,且类型必须是整型、字符型或枚举型,各常量表达式的值必须互不相同,否则就会出现相互矛盾的现象。
③ 语句i可以是一条或多条语句,是多条语句时不必用{ }将它们括起来。语句i处也可以没有语句,程序执行到此会自动向下顺序执行。
④ default语句一般出现在所有case语句之后,也可以出现在case语句之前或两个case语句之间。default语句也可以缺省。
⑤ 如果case语句组后没有break语句,则在执行完这条语句后,程序流程的控制会转移到下一个case语句组继续执行,每个case出现的次序不会影响switch语句的执行结果。
(2)switch语句嵌套
switch语句的格式:
switch( 表达式11)
{case 常量表达式11: 语句11;
switch(表达式2)
{语句1;
case 常量表达式21: 语句21;
case 常量表达式22: 语句22; …
}
case 常量表达式12: 语句12;
switch(表达式3)
{语句2;
case 常量表达式31: 语句31;
case 常量表达式32: 语句32; …
}
……
语句1n;
default :
语句1n+1; }
功能:首先计算表达式11的值,然后依次与常量表达式1i(1i=11,12, …,1n)比较,若表达式11的值与常量表达式11相等,则从常量表达式11处开始执行(执行入口),继续判断第二个switch语句的表达式2,再根据表达式2依次与常量表达式21、22……等进行匹配,寻找入口,直到第二个switch语句结束,回到第一个switch语句继续执行,流程控制转移到下一个case语句继续执行,直到最外层的switch语句结束。若所有的常量表达式1i(i=1,2, …, n)均不等于表达式11,则从最外层的default处开始执行。
【例3.14】 对嵌套if语句进行改进。
#include <iostream> using namespace std; int main () {long i; float bonus,bon1,bon2,bon4,bon6,bon10; int c; bon1=100000*0.1; bon2=bon1+100000*0.075; bon4=bon2+200000*0.05; bon6=bon4+200000*0.03; bon10=bon6+400000*0.015; cout<<"enter i:"; cin>>i; c=i/100000; if(c>10) c=10; switch(c) {case 0: bonus=i*0.1; break; case 1: bonus=bon1+(i-100000)*0.075; break; case 2: case 3: bonus=bon2+(i-200000)*0.05;break; case 4: case 5: bonus=bon4+(i-400000)*0.03;break; case 6: case 7: case 8: case 9: bonus=bon6+(i-600000)*0.015; break; case 10: bonus=bon10+(i-1000000)*0.01; } cout<<"bonus="<<bonus<<endl; return 0; }