【C】分支结构
分支结构
if 语句
if语句(1)
格式:
...... // 其他语句
if (表达式)
{
...... // 逻辑值为真所执行的语句、程序块
}
...... // 其它语句
int main()
{
int i;
printf("您老贵庚啊:");
scanf("%d",&i);//接收用户输入的整型数据
if (i>=18)
{
printf("进门左拐!\n");
}
return 0;
}
if语句(2)
格式:
...... // 其他语句
if (表达式)
{
...... // 逻辑值为真所执行的语句、程序块
}
else
{
...... // 逻辑值为假所执行的语句、程序块
}
....... // 其它语句
int main()
{
int i;
printf("您老贵庚啊:");
scanf("%d",&i);//接收用户输入的整型数据
if (i>=18)
{
printf("进门左拐!\n");
}
else
{
printf("慢走,不送!");
}
return 0;
}
if语句(3)
格式:
...... // 其他语句
if (表达式1)
{
...... // 逻辑值为真所执行的语句、程序块
}
else if (表达式2) { ...... }
else if (表达式3) { ...... }
.
.
.
else if (表达式n) { ...... }
else { ...... }
....... // 其它语句
实践
-
做一个按分数评级的程序,按以下标准评分:
- 90分及以上: A
- 80 ~ 90分: B
- 70 ~ 80分: C
- 60 ~ 70分: D
- 低于60分: E
int main() { int i; printf("请输入分数:"); scanf("%d",&i);//接收用户输入的整型数据 if (i>=90) { printf("A级!\n"); } else if (i>=80 && i<90) { printf("B级!\n"); } else if (i>=70 && i<80) { printf("C级!\n"); } else if (i>=60 && i<70) { printf("D级!\n"); } else { printf("E级 \n"); } return 0; }
switch语句 以及 break语句
格式:
...... //其他语句
switch (表达式)
{
case 常量表达式1: 语句或程序块1; break;
case 常量表达式2: 语句或程序块2; break;
......
case 常量表达式n: 语句或程序块n; break;
default: 语句或程序块n+1; break;
}
...... // 其他语句
注意每个case和default后面的语句中,末尾都有一个break语句,它用与跳出switch语句。如果没有break语句,程序在执行完相匹配的case后面的语句后,还会继续执行之后的其他分支的语句。
注意:
-
switch后面括号内的”表达式“,其值的类型应为整数类型(包括字符型)
-
switch语句中的case、default都是起一个标签的作用,用来标志一个位置。执行switch语句时,先计算表达式的值,然后将它与各case标签比较,如果和某一个case标签中的常量相同,流程就跳转到此case标号后面的语句。如果没有一个case标签的常量与它相匹配,流程再转去执行default标签后面的语句。
-
可以没有default语句,此时如果没有与表达式的值相匹配的case常量,则不执行任何语句,流程转到switch语句的下一个语句
-
每一个case常量必须互不相同,否则会出错
-
case标签只起到标记的作用,在执行switch语句时,程序是根据switch表达式的值找到相匹配的入口标签。在执行完一个case标签后面的语句后,就从此标签开始执行下去,不进行判断。所以case标签后面的语句末如果没有break语句,程序就会连续执行之后的其它标签的语句。
int main() { char ch; printf("请输入成绩评级:"); scanf("%c", &ch); switch (ch) { case 'A': printf("你的成绩在90分以上!\n"); case 'B': printf("你的成绩在80~90分之间!\n"); case 'C': printf("你的成绩在70~80分之间!\n"); case 'D': printf("你的成绩在60~70分之间!\n"); case 'E': printf("你的成绩在60分以下!\n"); default: printf("请输入有效的成绩评级! \n"); } return 0; }
运行结果
请输入成绩评级: C 你的成绩在70~80分之间! 你的成绩在60~70分之间! 你的成绩在60分以下! 请输入有效的成绩评级!
所以一般情况下,在执行一个case子句后,应当用break语句是流程跳出switch结果,即终止switch语句的执行。在最后的一个default子句中(如果没有default标签,则为最后一个case子句)可以不加break语句,因为流程已经到了switch结构的结束处。
-
case标签后面的语句可以不加花括号”{}“,多个case标签可以共用一组执行语句。如:
case 'A': case 'B': case 'C': printf("及格\n"); break; ...
实践
改善程序,通过评级输出分数范围
int main()
{
char ch;
printf("请输入成绩评级:");
scanf("%c", &ch); //接受用户输入的字符
switch (ch) //将接收到的字符与各个case给定的值进行比较
{
case 'A': printf("你的成绩在90分以上!\n"); break;//若接收的字符为'A',则跳转到此case标签
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"); break;//若接收的字符不符合以上五种情况,则输出
}
return 0;
}
运行结果
请输入成绩评级: C
你的成绩在70~80分之间!
分支结构的嵌套
如果说在一个if语句中包含另一个if语句,像这种情况下我们称之为if语句的嵌套,也称之为分支结构的嵌套
if (表达式)
if (表达式)
......
else
......
else
if (表达式)
......
else
......
根据流程图写代码
start=>start: 开始
input=>inputoutput: 输入两个整数到变量a和b中
condition=>condition: a!= b
condition2=>condition: a>b
output=>inputoutput: 输出a=b
output2=>inputoutput: 输出a<b
output3=>inputoutput: 输出a>b
end=>end: 结束
start->input->condition
condition(no,bottom)->output->end
condition(yes,right)->condition2
condition2(no,bottom)->output2->end
condition2(yes,right)->output3->end
int main()
{
int a, b;
printf("请输入两个数:");
scanf("%d %d", &a, &b); //两个数用空格隔开
// 也可以分开输入
// printf("请输入第一个数:");
// scanf("%d",&a);
// printf("请输入第二个数:");
// scanf("%d",&b);
if (a != b)
{
if (a > b)
{
printf("%d > %d\n", a, b);
}
else
{
printf("%d < %d\n", a, b);
}
}
else
{
printf("%d = %d\n", a, b);
}
return 0;
}
运行结果
请输入两个数:5 6
5 < 6
程序bug
谈谈初学者在编写程序中,有时会出现的一些bug
悬挂else
int main()
{
char isRain, isFree;
printf("是否有空(Y/N):");
scanf("%c",&isFree);
printf("是否下雨(Y/N):");
scanf("%c",&isRain);
if (isFree == 'Y')
if (isRain == 'Y')
printf("记得带伞噢^_^\n");
else
{
printf("女神没空!T_T");
}
return 0;
}
运行结果
是否有空(Y/N):Y
是否下雨(Y/N):女神没空!T_T
注意:我们可以看到程序运行结果出现了问题。因为此程序中,scanf接收的是两个字符,我们在输入第一个字符后按下的回车会被视为第二个字符被接收。改进程序,我们需要使用 getchar()
将回车过滤掉。
printf("是否有空(Y/N):");
scanf("%c",&isFree);
getchar(); //过滤回车接收第二个输入
printf("是否下雨(Y/N):");
scanf("%c",&isRain);
运行结果
是否有空(Y/N):Y
是否下雨(Y/N):Y
记得带伞噢^_^
//再运行一遍,尝试其他结果
是否有空(Y/N):Y
是否下雨(Y/N):N
女神没空!T_T
可以发现,运行第二遍时我们得到的结果与我们预期的并不相符。这是因为if,else结合是根据就近原则,else始终与同一对括号内最近的未匹配的if结合。程序本意是想让else与第一个if相匹配,但程序却将else与第二个if匹配在一起,造成悬挂else问题。解决问题只需要将属于第一个if的全部语句用大括号{}封装起来,这样else与第二个if不在同一括号内,就不会匹配在一起了。所以在编写程序时,在if和else后边,无论是一个语句还是多个语句,最好养成用大括号括起来的习惯。
if (isFree == 'Y')
{
if (isRain == 'Y'){
printf("记得带伞噢^_^\n");
}
}
else
{
printf("女神没空!T_T");
}
等于号带来的问题
int main()
{
char hasBF;
printf("小花有男朋友吗?(Y/N):");
scanf("%c", &hasBF);
if (hasBF = 'Y')
{
printf("那......祝福你们咯!\n");
}
else
{
printf("那我们在一起吧!\n");
}
return 0;
}
运行结果:
小花有男朋友吗?(Y/N):N
那......祝福你们咯!
运行结果与预期的情况并不相符。这是因为if后面的关系表达式为hasBF = 'Y'
,意思是将'Y'赋值给hasBF,因为非0的值都为真,所所以程序会执行if里的语句。我们需要将赋值号(=)改成等号(==)。
if (hasBF == 'Y')
{
printf("那......祝福你们咯!\n");
}
else
{
printf("那我们在一起吧!\n");
}
return 0;
}
运行结果
小花有男朋友吗?(Y/N):Y
那我们在一起吧!
注意:但在日常编写代码时,有时也可能因为疏忽而没有发现等号(==)写成了赋值号(=),导致运行结果有问题,我们却没有及时发现。为了避免这种情况,我们也可以将变量与常量位置互换,如
if ('Y' == hasBF)
{
printf("那......祝福你们咯!\n");
}
这样如果等号(==)写成了赋值号(=),就变成了将变量赋值给常量,程序就会报错,因为左值不能被右值给赋值。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)