- 为什么要学习选择结构
- image.png
- if else 详解
- 1.将上图用代码实现
- 2.注意事项 : else匹配问题 ---> 悬空else
- 3.典型案例 : 输入年龄,判断状态
- switch-case详解
- 1.将if-else结尾的需求用switch-case实现
- 2.switch-case注意事项
- 2.1 switch后边的括号只能是 整形表达式(包括短整/长整) 或者 字符型
- 2.2switch中的default
- 2.3 break
- switch-case嵌套
- 总结
- 使用if-else实现
- 使用switch-case实现
- 综上
大家都知道,程序是为了解决生活中的问题,而生活中处处是选择,例如:
对于这种我只想说
好了,话不多说,进入正题
到了现在这个年纪,这个选择早就已经过去,很不幸,我选的是右边这个,如果有初高中的同学看到此篇文章,此路不通。
生活处处是选择,所以在程序中要有对应的结构来实现,这便是今天的主角。
选择结构分为两种实现,各有特点 if else / switch case
#includeint main(void){ int input = 0; //好好学习输入1 天天打游戏输入2 printf("好好学习输入1 n 天天打游戏输入2"); scanf("%d",&input); if(1 == input){ printf("上岸985/211); }else{ printf("大专/普通本科"); } return 0; }
解析: 这就是最简单的if - else 结构, if 一个分支 ,else 一个分支, 只会走其中一条路线
2.注意事项 : else匹配问题 —> 悬空else话不多说,直接上代码
#includeint main(void){ int a = 2; int b = 3; int c = 4; if(a > b) if(b < c){ printf(" b < c "); } else{ printf(" 呵呵 "); } return 0; }
上述代码,大家认为的运行结果是什么呢?
打印 b< c?
还是只打印 呵呵
可能出乎你的意料,看结果
结果什么也没有打印
解析: else是和它离的最近的if匹配的,并且此if没有被其他else匹配
可能大家还没有理解,把代码缩进一下就明白了
else和这个if相结合,因为a>b为假,所以什么也不输出
eg: 18岁以下为少年 ,18~35为青年 , 35~60中年 60以上为老年
输入年龄,输出状态
#includeint main(void){ int age = 0; scanf("%d",&age); if(age <= 18) printf("少年); else if(age > 18 && age <= 35) //可以直接写成这样( age <= 35) 读者可以自行琢磨 printf("青年"); else if(age > 35 && age <= 60) printf("中年"); else printf("老年"); return 0; }
简单看出,if - else 结构适合范围类型的选择
如果有这样一个案例 :
如果输入1 表示星期1 , 2 表示星期二 …1 -7 输出 星期一-七
我们当然可以使用if-else来实现
有没有觉得简单而又冗余的逻辑,一篇有一篇,这只是7个,如果更复杂的呢?
所以让我们来看一下 swith -case 结构
switch-case详解 1.将if-else结尾的需求用switch-case实现#includeint main(void) { int num = 0; scanf("%d", &num); switch (num) { case 1: printf("星期一"); break; case 2: printf("星期二"); break; case 3: printf("星期三"); break; case 4: printf("星期四"); break; case 5: printf("星期五"); break; case 6: printf("星期六"); break; case 7: printf("星期七"); break; } return 0; }
2.switch-case注意事项看起来是不是好多了,swith-case 更适合于处理具体数据的选择,
2.1 switch后边的括号只能是 整形表达式(包括短整/长整) 或者 字符型让我们来看看switch的注意事项吧
这是一个最基本的switch结构
1.switch是把括号中变量的值(即1处) 去下边case所列举的值去匹配
如果成功匹配,执行3处的语句
如果匹配不上,那就成顺序结构 ,啥也不干
case后必须是整型常量表达式
2.设想一下: 如果可以为浮点型的话
那么,3.14 可以匹配的有: 3.140 , 3.1400 , 3.14000…
故只能为整形或字符型
2.2switch中的default这就有人问了,为什么可以是字符型呢?
字符型在内存中以ASCII码的形式存储,简单来说,就是一个字符对应一个数字
所以说,字符可以说是特殊的整形
这段代码中,如果输入不是 a / b ,那产生的结果是什么呢
显然,default代表默认,意味着如果所有的case子句都匹配不上的话,就执行default下的语句
注意: 与default的位置无关,default子句可以放在开头,或者case子句之间,也可以是结尾
2.3 break在前边的switch-case子句中,基本都出现的break子句,为什么呢
再匹配到一个case子句执行完了,如果不执行break,会继续向下执行,直到碰到break或者到结尾才会跳出
这个代码就可以看出,我输入的是a ,但是 把下面所有的结果都输出来了,这是一个非常要注意的地方
一定要添加break子句
case后边的值决定从哪里进去,而break决定从哪里出去
我们有时可以利用这个小技巧
eg: 判断小写字母是否为元音字母
int main(void) {
char ch = getchar();
switch (ch) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
printf("是元音字母");
break;
default:
printf("不是元音字母 ");
}
return 0;
}
switch-case嵌套多个值为一个处理结果的时候,可以起到很大的帮助
#includeint main() { int m = 1; int n = 3; switch (m) { case 1: m++; case 2: n++; case 3: switch (n) {//switch允许嵌套使用 case 1: n++; case 2: m++; n++; break; } case 4: m++; break; default: break; } printf("m = %d, n = %dn", m, n); return 0; }
总结大家可以计算一下这个,学校一般爱考这种题,注意是否有break就可以
接下来我们使用 if - else 和switch-case 实现同一个案例
使用if-else实现输入整数分数,60分 以下不及格,60-70 及格 70 -80 80-90 良好 90-100优秀
#include使用switch-case实现int main(void) { int score = 0; scanf("%d", &score); if (score < 60) printf("不及格"); else if (score < 70) printf("及格"); else if (score < 80) printf("中等"); else if (score < 90) printf("良好"); else printf("优秀"); return 0; }
int main(void) {
int score = 0;
scanf("%d", &score);
switch (score / 10) {
case 1:
case 2:
case 3:
case 4:
case 5:
print("不及格");
break;
case 6:
printf("及格");
break;
case 7:
printf("中等");
break;
case 8:
printf("良好");
break;
case 9:
case 10:
printf("优秀");
}
return 0;
}
综上
以上对比显而易见,并无优劣,各有千秋,谁好用用谁
个人观点如下
- 碰到范围类型的选择,优先考虑 if-else
- 碰到具体数据的选择,优先考虑switch-case,switch-case最大缺陷是只能整型
注:
- 本文所有见解,为本人拙见,如有误导,请多指教
- 如果对您有所帮助,点赞支持一下


![[详解C语言]一文带你玩转选择(分支)结构 [详解C语言]一文带你玩转选择(分支)结构](http://www.mshxw.com/aiimages/31/1017763.png)
