C语言—分支控制语句

本文详细介绍了C语言中的两种选择结构——if...else语句和switch...case语句,包括它们的格式、使用注意事项以及编程练习。内容涵盖if...else的简化、阶梯和嵌套格式,强调了条件判断的细节,以及switch...case的表达式要求、case击穿现象和default分支的用途。通过示例代码展示了如何在实际编程中应用这些结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


C语言的程序结构只有三种: 顺序结构、分支结构(选择结构)、循环结构。

1 if…else语句

1.1 格式

1 一、简化格式
2 if(表达式){
3 代码块;
4 }
5 执行逻辑:先执行表达式,
6 如果表达式为真则执行代码块,否则不执行代码块
7 if(表达式){
8 代码块1;
9 }else{
10 代码块2;
11 }
12 执行逻辑:先执行表达式,
13 如果表达式为真则执行代码块1,否则执行代码块2
14 二、阶梯格式
15 if(表达式1){
16 代码块1;
17 }else if(表达式2){
18 代码块2;
19 }else if(表达式n){
20 代码块n;
21 }else{
22 其他分支;
23 }
24 执行逻辑:先执行表达式1,如果表达式1为真,则执行代码块125 否则继续执行表达式2,如果表达式2为真,则执行代码块2
26 依次类推,如果所有表达式都为假,则执行else分支
27 如果不考虑其他分支的情况,整个else分支都可以不写
28 三、嵌套格式
29 if(表达式1){
30 代码块1;
31 if(表达式11){
32 代码块11;
33 }else if(表达式12){
34 代码块12;
35 }else{
36 其他分支1
37 }
38 }else if(表达式2){
39 代码块2;
40 }else{
41 其他分支;
42 }
43 执行逻辑:就是阶梯格式的嵌套使用

1.2 if…else语句注意事项

1.如果if…else语句的代码块只有一行,那么{}可以省略不写
2.else不能独立出现,前面必须有if与之对应
3.else与同一层次的前面与之最近的if结合
4.if…else语句的表达式一般情况下都是由关系运算符和逻辑运算符组成的,表达式的结果是一个bool类型。如果是异常的情况,要注意下面的用法
if(a=b) 这种写法表达式的结果取决于b的值 b为0则为假 b为非0则真
if(a=10) 这种写法和上面的写法是一个道理,常量的值非0即为真 0为假
一般情况下 常量和变量比较是否相等时,都将常量写在等号左边
if(10== a)
这样写,少写等号的时候,编译阶段就会报错了,因为常量不能被赋值
if(a) 这种写法表达式的结果取决于a的值,a为0则为假 a为非0则为真
等价于 if(0!=a)
if(!a) 这种写法表达式的结果取决于a的值,a为0则为真 a为非0则为假。等价于 if(0==a)
浮点型存储的是近似值,不能用 == 判断相等
5.如果同一层次中同时出现多个if时
if(){}
if(){}
上下两个if之间是独立的,没有任何关系

1 #include <stdio.h>
2
3 int main(int argc, const char *argv[])
4 {
5 printf("‐‐‐‐start‐‐‐‐\n");
6 int a = 10;
7 int b = 20;
8 #if 0
9 if(a<b){
10 printf("hqyj\n");
11 }
12 #endif
13
14 #if 0
15 if(a>b){
16 printf("yes\n");
17 }else{
18 printf("no\n");
19 }
20 #endif
21
22 #if 0
23 if(10<a && a<1){
24 printf("[‐10, ‐1]\n");
25 }else if(a == 0){
26 printf("a == 0\n");
27 }else{
28 printf("其他分支\n");
29 }
30 #endif
31 scanf("%d%d", &a, &b);
32 if(a>b){
33 printf("a>b\n");
34 if(a>0){
35 printf("a>0\n");
36 }else{
37 printf("a<=0\n");
38 }
39 }else if(a<b){
40 printf("a<b\n");
41 if(b>0){
42 printf("b>0\n");
43 }else{
44 printf("b<=0\n");
45 }
46 }else{
47 printf("a==b\n");
48 }
49
50 printf("‐‐‐‐end‐‐‐‐\n");
51 return 0;
52 }

1.3 if…else语句练习

1.在终端输入一个整数,用来表示学生的成绩
输出学生成绩对应的等级
[90,100] A
[80, 90) B
[70, 80) C
[60, 70) D
[0,60) 不及格

1 #include <stdio.h>
2
3 int main(int argc, const char *argv[])
4 {
5 int num = 0;
6 printf("请输入一个成绩:");
7 scanf("%d", &num);
8
9 if(90<=num && num<=100){
10 printf("A\n");
11 }else if(80<=num && num<90){
12 printf("B\n");
13 }else if(70<=num && num<80){
14 printf("C\n");
15 }else if(60<=num && num<70){
16 printf("D\n");
17 }else if(0<=num && num<60){
18 printf("不及格\n");
19 }else{
20 printf("输入的成绩范围不合理..\n");
21 }
22
23 return 0;
24 }

2.在终端输入一个整数,用来表示年份,输出这一年是平年还是闰年
闰年:能被4整除且不能被100整除,或者能被400整除
2000 闰
2004 闰
2022 平
1900 平

1 #include <stdio.h>
2
3 int main(int argc, const char *argv[])
4 {
5 int year = 0;
6 printf("请输入一个年份:");
7 scanf("%d", &year);
8
9 if( (year%4==0 && year%100!=0) || year%400==0){
10 printf("闰年\n");
11 }else{
12 printf("平年\n");
13 }
14
15 return 0;
16 }

3.在终端输入三个数,按照从小到大的顺序排序
如:输入 a:100 b:30 c:50
//你的操作
printf(“%d<%d<%d\n”, a, b, c);// 30<50<100

1 //思路1:把每种情况都考虑进去
2 if(a>b && b>c){
3 }else if(a<b && c<b){
4 }
5 .....
6
7 //思路2:两两比较
8 //a先和b比,将较小的放在a里
9 //然后a再和c比,将较小的放在a里,此时a中保存的就是三个数中最小的了
10 //然后b再和c比,将较小的放在b里,就完成了
11 #include <stdio.h>
12 int main(int argc, const char *argv[])
13 {
14 int a,b,c;
15 int temp = 0;
16 scanf("%d%d%d", &a, &b, &c);
17
18 //先比较a和b 将较小的放在a中
19 if(a>b){
20 temp = a;
21 a = b;
22 b = temp;
23 }//此时a中保存的就是a和b中较小的了
24
25 //再比较a和c
26 if(a>c){
27 temp = a;
28 a = c;
29 c = temp;
30 }//此时a中保存的就是 三个数中最小的了
31
32 //再比较b和c
33 if(b>c){
34 temp = b;
35 b = c;
36 c = temp;
37 }//此时b中保存的就是 b和c中较小的了
38
39 //排序就已经完成了
40 printf("%d < %d < %d\n", a, b, c);
41
42 return 0;
43 }

4.在终端输入三个整数,分别表示三角形的三边长
输出能否构成三角形
如果能构成三角形,再输出能构成什么类型的三角形:等腰、等边、直角、普通。

1 #include <stdio.h>
2
3 int main(int argc, const char *argv[])
4 {
5 int a,b,c;
6 printf("请输入三角形的三边长:");
7 scanf("%d%d%d", &a, &b, &c);
8
9 if(a+b>c && b+c>a && a+c>b){
10 printf("能构成三角形\n");
11 if(a==b && b==c){
12 printf("等边\n");
13 }else if(a==b || b==c || a==c){
14 printf("等腰\n");
15 }else if(a*a+b*b==c*c || b*b+c*c==a*a || a*a+c*c==b*b){
16 printf("直角\n");
17 }else{
18 printf("普通\n");
19 }
20 }else{
21 printf("不能构成三角形\n");
22 }
23
24 return 0;
25 }

2 switch…case语句

2.1 格式

1 switch(表达式){
2 case 常量表达式1:
3 代码块1;
4 break;
5 case 常量表达式2:
6 代码块2;
7 break;
8 case 常量表达式n:
9 代码块n;
10 break;
11 default:
12 其他分支;
13 break;
14 }

2.2 注意事项

1.switch后面的()里面的表达式可以是变量,也可以是一个完整的表达式。一般情况下,表达式的结果都是整型或者字符类型,(注意不能是浮点型)
2.每个case后面的常量表达式,就是switch后面()中表达式所有可能的结果
3.break的作用是执行完某个分支,就立即结束整个switch…case语句,如果不加break,那么程序会继续执行下面case中的代码块(不判断直接执行),直到遇到break了,或者整个switch…case语句结束。 这种现象叫做 case击穿 。
4.default分支的作用相当于if…else语句中的else分支,如果前面所有的case都不满足,则执行default分支,如果不关心其他情况,整个default分支都可以不写
例:

1 #include <stdio.h>
2
3 int main(int argc, const char *argv[])
4 {
5 int num = 0;
6 scanf("%d", &num);
7
8 switch(num){
9 case 1:
10 printf("11111111111111111\n");
11 break;
12 case 2:
13 printf("22222222222222222\n");
14 break;
15 case 3:
16 printf("33333333333333333\n");
17 break;
18 default:
19 printf("other\n");
20 break;
21 }
22
23 return 0;
24 }

2.3 练习

1.编码实现一个简易的计算器功能 (+ - * 功能即可)
要求:在终端输入表达式 输出计算的结果
如:输入 3+5 则输出 8
如:输入 4*7 则输出 28

1 #include <stdio.h>
2 int main(){
3 int lvalue = 0;//左操作数
4 int rvalue = 0;//右操作数
5 char operator = 0;//运算符
6 printf("请输入表达式:");
7 scanf("%d%c%d", &lvalue, &operator, &rvalue);
8 switch(operator){
9 case '+':
10 printf("%d + %d = %d\n", lvalue, rvalue, lvalue+rvalue);
11 break;
12 case '‐':
13 printf("%d ‐ %d = %d\n", lvalue, rvalue, lvalue‐rvalue);
14 break;
15 case '*':
16 printf("%d * %d = %d\n", lvalue, rvalue, lvalue*rvalue);
17 break;
18 default:
19 printf("目前仅支持 + ‐ * 运算\n");
20 break;
21 }
22
23 return 0;
24 }

2.将前面使用 if…else 实现的学生成绩等级管理的例子
用 switch…case 实现一次

1 #include <stdio.h>
2
3 int main(){
4 int num = 0;
5 scanf("%d", &num);
6 switch(num/10){
7 case 10: //利用了case击穿
8 case 9:
9 printf("A\n");
10 break;
11 case 8:
12 printf("B\n");
13 break;
14 case 7:
15 printf("C\n");
16 break;
17 case 6:
18 printf("D\n");
19 break;
20 default:
21 printf("不及格\n");
22 break;
23 }
24
25 return 0;
26 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值