目录
之前我们都只是面临的简单判断,也就是面对的是两三种不同的判断条件,执行两三种不同的代码分支。
但是让我们遇到更复杂的情况,需要进行更复杂的判断的时候。就需要使用判断的嵌套了。
例如,我们会在周三,周六,周天三天进行跑步,但是跑步的条件还需要是晴天不能下雨,如果我们用if-else的判断,就需要写六种条件
分别是
1,今天是周三,今天没下雨,跑步
2,今天是周三,今天下雨,不跑步
3,今天是周六,今天没下雨,跑步
4,今天是周六,今天下雨,不跑步
5,今天是周天,今天没下雨,跑步
6,今天是周天,今天下雨,不跑步
我们要实现这样的判断代码,会有两个弊端:
一个是分支很多(比如这里的6个分支),容易漏掉一两个分支;
第二个是判断条件很复杂,每个判断条件都是两个变量的逻辑运算组合。
翻译成代码的话,就需要写很多判断分支,且有判断条件:
- if(today_is_wednesday && today_sunny){
- printf("跑步\n");
- } else if (today_is_wednseday && !today_sunny){
- printf("不跑步\n");
- } else if (today_is_saturday && today_sunny) {
- printf("跑步\n");
- } else if (today_is_saturday && !today_sunny) {
- printf("不跑步\n");
- } else if (today_is_sunday && today_sunny) {
- printf("跑步\n");
- } else if (today_is_sunday && !today_sunny){
- printf("不跑步\n");
- } else {
- printf("其他情况\n")
- }
1.第一个判断条件 if
2.第二个判断条件 else if
3.第三个判断条件 else if
4.第四个判断条件 else if
5.第五个判断条件 else if
5.第五个判断条件 else if
6.第六个判断条件 else if
7.第七个判断条件 else
上述的代码,我们可以先判断今天是星期几,然后再判断今天是否下雨,这两就分成了两层的判断结构,代码结构变得更清晰了,一层一层的看,同时判断条件也简化了,每次只判断一个条件。
- if (today_is_wednesday) {
- if(today_sunny) {
- printf("跑步\n");
- } else {
- printf("不跑步\n");
- }
- } else if (today_is_saturday) {
- if(today_sunny) {
- printf("跑步\n");
- } else {
- printf("不跑步\n");
- }
- } else if (today_is_sunday) {
- if(today_sunny) {
- printf("跑步\n");
- } else {
- printf("不跑步\n");
- }
- } else {
- printf("其他情况\n");
- }
1.第一层判断,今天是星期几
2.第二层判断,今天是否是晴天
1.1
我们来看一个最简单的嵌套判断代码:
-
- if(a==100){
- if(b==200){
- printf("a的值是100,且b的值是200\n");
- }
- }
1.第一个判断条件,a是否等于100
2.第一个判断条件的花括号
3.第二个判断条件,b是否等于200
4.第二个判断条件的花括号
5.两层判断都符合的话,执行打印输出的代码
代码的判断顺序仍然是从上到下,第一次判断成立以后,再进行内层的判断。
这种嵌套判断语句里面,花括号的配对很比较容易出错的,我们需要记住的是从最内层的括号对开始配对,一个反花括号}需要跟上面最近的正花括号{配对。
1.2
else里面也可以嵌套,我们来看看下面的代码:
- if( a == 100 ){
- printf("a是100\n" );
- } else {
- if( b == 200 ){
- printf("a不是100,但b是200\n" );
- }
- }
1.外层if判断的代码块
2.内层else判断的代码块
3.else里面嵌套的if判断
- if (a==100){
- printf("a是100\n");
- } else {
- if(b==200){
- printf("a不是100,但b是200\n");
- } else{
- printf("a不是100,b也不是200\n");
- }
- }
输出结果
- a不是100,但b是200
-
-
我们再次回顾一下判断嵌套的收益:
1,增加代码的易读性;
2,降低判断条件的复杂度。
以此类推,判断的嵌套是非常灵活的。可以根据我们的需求使用,比如一个招聘需求,罗列了很多条件,实际上就是一个复杂的判断分支。
第一层,是否本科以上;第二层,是否计算机相关专业;第三层,是否有实习经历等等。
通过对嵌套判断的梳理,我们就能把各种不同的现实情况整理成一个程序可以通过不同条件来做的判断了。
同样是判断分支的处理,除了if-else这种几乎所有编程语言都有的判断语句结构,C语言还有自己独有的switch判断。
2.1
switch
会根据判断条件符合哪个值,直接跳转到对应的分支执行代码。
switch
语句通过将表达式的值与常量值进行比对,如果相等则执行后面的语句,如果不相等则跳到下一个case
语句。
- har grade = 'A';
- switch(grade)
- {
- case 'A' :
- printf("很棒!\n" );
- break;
- case 'B' :
- printf("还不错\n" );
- break;
- case 'C' :
- printf("勉勉强强\n" );
- break;
- case 'D' :
- printf("及格了\n" );
- break;
-
- default :
- printf("不及格\n" );
- }
1.定义字符变量grade,赋值B
2.判断成绩grade
3.如果grade == A,就执行下面两行代码
4.break 标志一个case分支语句的结束
2.2
1.如果成绩等于B,就执行下面两行代码
- case 'B':
- printf("还不错\n );
- break;
2.如果成绩等于C,就执行下面两行代码
- case 'C':
- printf("勉勉强强\n");
- break;
3.如果成绩等于D,就执行下面两行代码
- case 'D':
- printf("及格了\n");
- break;
4.其余情况,执行default里面的代码
- default:
- printf("不及格\n");
- }
我们对成绩进行了判断,A是很好,B是还不错,C是勉勉强强,D是及格,其余的成绩字符都是不及格。
当switch语句运行时遇到break
关键字时会跳出,意思就是当语句运行到break时就不再运行了,接下来剩下的case语句也不会再执行,switch语句结束。
break
是case判断分支里面的终点,所有的case语句都需要有个break
。
switch语句中,所有case无法囊括的情况,都会执行default
中的代码。
switch的代码执行顺序也很像判断,只会执行其中的一个case分支的代码,或者default分支中的代码。
switch判断在大部分时候是跟if-esle判断等价的,他们可以互相交换,比如我们也可以用if-else来实现对学习成绩的判断:
- char grade = 'B';
- if (grade == 'A') {
- printf("很棒!\n");
- } else if (grade == 'B') {
- printf("还不错\n");
- } else if (grade == 'C') {
- printf("勉勉强强\n");
- } else if (grade == 'D') {
- printf("及格了");
- } else {
- printf("不及格\n");
- }
不管是if判断还是switch判断,重点都在于我们先设置不同的判断条件,然后根据不同的判断条件来决定代码的执行顺序。
eg:
switch语句结构包含很多内容,
花括号,冒号,break,default等千万不要遗漏噢~
在撰写这篇文章时,我参考了《白纸编程》这个app的观点和思想,我要感谢他们对我的启发和帮助。