C语言是一门结构化的程序设计语言
支持三种结构:
- 顺序结构:正常的从头写到尾
- 选择结构:if语句;switch语句
- 循环结构:while循环;for循环;do-while循环
switch语句
除了if语句外,C语言还提供了switch语句来实现分支结构。
switch语句是一种特殊形式的if…else…结构,用于判断条件有多个结果的情况。它把多重的else…if…改成更易用,可读性更好的形式。
switch (expression)
{
case value1: statement
case value2: statement
default: statement
}
上⾯代码中,根据表达式 expression 不同的值,执⾏相应的 case 分⽀。
比如:表达式expression的结果如果是value1,就执行value1这个分支;表达式expression的结果如果是value2,就执行value2这个分支;
如果找不到对应的值(既不是value1,也不是value2),就执⾏ default 分⽀。
注:
• switch 后的 expression 必须是整型表达式
• case 后的值,必须是整形常量表达式
字符可以出现在“switch”,“case”里,因为字符存储的时候存的是ASCII码值(整数)
switch语句中的break
练习:输入任意一个整数值,计算除3之后的余数。
if语句写法
尝试用switch语句写法:
键盘给num输入的值为4,4%3余数是1,从case 1这条分支进去,打印“余数是1”。可是把case 2,“余数为2”的情况也打印了,这是为什么呢?
因为num%3的结果是几,就从case 几进去,但是从哪个地方跳出去呢?如果语句的后面没有东西使程序跳出这条语句,程序就会执行下面的语句
例如:
此时num%3余0,就从case 0这条分支进去,但是把以下余数为“1”,为“2”的情况全打印了
所以:case只是决定了入口,决定不了从哪出去。所以如果想跳出,得在语句后面加break.
此时程序就得到了我们想要的结果了。
练习:输⼊⼀个1~7的数字,打印对应的星期⼏
例如:
输⼊:1 输出:星期⼀
输⼊:2 输出:星期⼆
输⼊:3 输出:星期三
输⼊:4 输出:星期四
输⼊:5 输出:星期五
输⼊:6 输出:星期六
输⼊:7 输出:星期天
int main()
{
int num = 0;
scanf("%d",&num);
switch (num)
{
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三");
break;
case 4:
printf("星期四");
break;
case 5:
printf("星期五");
break;
case 6:
printf("星期六");
break;
case 7:
printf("星期天");
break;
}
return 0;
}
switch语句中的default
依据上面的代码,当输入8的时候,程序就出问题了,什么也不打印:
当所有case都不能被匹配的时候,则需要加一条default,使代码完整。
如果需求发⽣变化,变为:
- 输⼊1-5,输出的是“⼯作⽇”;
- 输⼊6-7,输出“休息⽇”
int main()
{
int num = 0;
scanf("%d",&num);
switch (num)
{
case 1:
printf("工作日\n");
break;
case 2:
printf("工作日\n");
break;
case 3:
printf("工作日");
break;
case 4:
printf("工作日");
break;
case 5:
printf("工作日");
break;
case 6:
printf("休息日");
break;
case 7:
printf("休息日");
break;
default:
printf("输入错误,请输入1~7的数字\n");
break;
}
return 0;
}
以上代码虽然可以完成题目要求,但是有更简便的写法:
int main()
{
int num = 0;
scanf("%d",&num);
switch (num)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日");
break;
default:
printf("输入错误,请输入1~7的数字\n");
break;
}
return 0;
}
switch语句中的case和default的顺序问题
在 switch 语句中 case 子句和 default 子句有要求顺序吗? default 只能放在最后吗?
其实,在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满⾜实际需求的就可以。
例如:
我们把default放在最前面,键盘输入8时依旧会照常处理,只不过我们通常是把 default 子句放在最后处理的。
但是我们不能把default影响逻辑随意放置,例如将它放在中间,这样语法上虽然是正确的但是结果是错误的。
我们不要求default的位置,但是代码的结果要是对的
补充:switch语句也可以嵌套,switch里面也可以有switch,但是break只能跳出本层的switch不能跳出外层的switch。