处理多分支结构,可以考虑使用语法更简便的 switch 语句
…… // 其它语句
switch (表达式)
{
case 常量表达式1: 语句或程序块
case 常量表达式2: 语句或程序块
……
case 常量表达式n:语句或程序块
default: 语句或程序块
}
…… // 其它语句
这里每个 case 后边的常量是匹配 switch 后边表达式的值
case 后边必须跟一个常量值,而不能是一个范围
case后的常量表达式值不能相同
case后允许有多个语句,可以不用大括号
各case和default句子的先后顺序可以变动,且不会影响程序执行结果
如果所有的 case 均没有匹配的,那么执行 default 的内容
default 是可选的,如果没有 default,并且所有的 case 均不匹配,那么 switch 语句不执行任何动作
使用 break 语句跳出
switch 语句中的 case 和 default 事实上都是“标签”,用来标志一个位置而已。当 switch 跳到某个位置之后,就会一直往下执行,所以我们这里还需要配合一个 break 语句,让代码在适当的位置跳出 switch。
事实上 break 语句在循环中能发挥更大的作用(⊙o⊙)哦!
//用开关实现:输入成绩评级就能输出对应的成绩范围
#include<stdio.h>
int main(void)
{
char ch;
printf("请输入学生成绩评级\n");
scanf("%c", &ch);
switch (ch)
{
case 'A': printf("90分以上\n"); break;/*每行用break中断,表示符合此项条件
就运行,且不再运行其他项*/
case 'B': printf("80-90分\n"); break;
case 'C': printf("70-80分\n"); break;
case 'D': printf("60-70分\n"); break;
case 'E': printf("60分以下\n"); break;
default: printf("格式错误,请输入有效的评级\n");/*如果所有的 case 均没有匹配的,
那么执行 default 的内容*/
}
system("pause");
return 0;
}
//用开关实现:简易计算器
#include<stdio.h>
int main(void)
{
int a, b;
char ch;
printf("请输入计算式\n");
scanf("%d%c%d", &a, &ch, &b);
switch (ch)
{
case'+':printf("%d+%d=%d\n", a, b, a + b); break;
case'-':printf("%d-%d=%d\n", a, b, a - b); break;
case'*':printf("%d*%d=%d\n", a, b, a * b); break;
case'/':printf("%d/%d=%d\n", a, b, a / b); break;
default:printf("输入格式错误\n");
}
system("pause");
return 0;
}
分支结构的嵌套
如果在一个 if 语句中包含另一个 if 语句,我们就称之为 if 语句的嵌套,也叫分支结构的嵌套。
悬挂 else
这个问题虽然已经为人熟知,而且也并非 C 语言所独有。但即使是有多年经验的 C 程序员,也常常在此失误过!
考虑下面的代码片段:
if (x == 0)
if (y == 0)
error();
else
z = x + y;
这段代码中编程者的本意是应该有两种主要情况,x 等于 0 以及 x 不等于 0。对于 x 等于 0 的情形,除非 y 也等于 0(此时调用 error 函数),否则程序不作任何处理;对于 x 不等于 0 的情形,程序将 x 与 y 之和赋值给 z。
然而,这段代码实际上所做的却与编程者的意图相去甚远。
原因在于 C 语言中有这样的规则,else 始终与同一对括号内最近的未匹配的 if 结合。
如果我们按照上面这段程序实际上被执行的逻辑来调整代码缩进,大致是这个样子:
if (x == 0)
if (y == 0)
error();
else
z = x + y;
也就是说,如果 x 不等于 0,程序将不会做任何处理。如果要得到原来的例子中由代码缩进体现的编程者本意的结果,应该这样写:
if (x == 0)
{
if (y == 0)
{
error();
}
}
else
{
z = x + y;
}
现在,else 与第一个 if 结合,即使它离第二个 if 更近也是如此,因为此时第二个 if 已经被括号“封装”起来了。