文章目录
什么是语句if语句悬空else switch语句break的使用default 的使用在之前的分享中,我们了解到了c语言是结构化的程序设计语言。分为顺序结构,选择结构,循环结构三大类。今天我将与大家详细分享选择结构中if switch
的用法。
什么是语句
我们说详解分支语句,首先我们需要知道什么是语句,其实用分号隔开的就是一个语句。在c语言中语句可以大致分为五类:
1.表达式语句
2.函数调用语句
3.控制语句
4.复合语句
5.空语句
我们今天所讲的是控制语句,控制语句主要用来控制程序的执行流程,实现程序的各种结构方式。
例如:
1.条件判断语句也叫分支语句:
if
语句、switch
语句2.循环执行语句:
do while
·语句 、while
语句、for
语句3.转向语句 :
break
语句、goto
语句、continue
语句、return
语句
if语句
if语句的语法结构到底是怎么样的呢?在if语句中分为双分支、多分支。语法结构如下
int main(){if (表达式)语句;//双分支if (表达式)语句1;else语句2;//多分支if (表达式1)语句1;else if (表达式2)语句2;else语句3;}
如果表达式为真就执行语句,那么在C语言中如何表示真假呢?C语言规定了非0就为真,0就为假。注意if else if else
默认只能控制一个语句。
#include<stdio.h>int main(){int a = 1;if (a == 1)printf("hehe\n");elseprintf("haha\n");printf("momo\n");return 0;}
例如上面这个代码最后输出的结果是hehe和momo同时输出。我们的思路其实是当a = 1时我们输出hehe其他时候输出haha和momo,那么该如何实现呢?我们就需要让else同时控制两个语句,执行多条语句。我们使用{}将语句括起来变成一个代码块,就可以实现。
#include<stdio.h>int main(){int a = 1;if (a == 1)printf("hehe\n");else{printf("haha\n");printf("momo\n");}return 0;}
悬空else
在分支语句中还有很多小的细节值得我们注意例如悬空else。
#include <stdio.h>int main(){int a = 0;int b = 2;if(a == 1)if(b == 2)printf("hehe\n");elseprintf("haha\n");return 0;}
上面这个代码的输出结果是什么呢?是不是有很多小伙伴觉得输出的结果是haha。其实不是,上面这个代码什么也没有输出。出现错误判断的关键就是对else
的判断不准确,else
是与第一个if
对应还是与第二个if
对应呢?这种情况我们就称为悬空else。直接上结论,else
与他距离最近的if
相匹配。所以上面的代码可以写为
#include <stdio.h>int main(){int a = 0;int b = 2;if(a == 1){if(b == 2)printf("hehe\n");elseprintf("haha\n");}return 0;}
不知道大家有没有感觉到第二次的代码比第一次的代码,逻辑更加清晰,更具观赏性。这里我们不得不提到代码书写风格的重要性。好的书写形式可以更好的帮助我们理解代码。
例如:
int main(){if (condition){return x;}return y;}
int main(){if (condition){return x;}else{return y;}}
上面两个代码的逻辑是一样的,但是,是不是代码2的逻辑更加清晰。
int main(){int num = 1;if (num == 3){printf("ok\n");}return 0;}
int main(){int num = 1;if (3 == num){printf("ok\n");}return 0;}
上述代码中的区别就在于if
语句中的表达式不一样,虽然表达的意思相同但是代码2中的写法更加不容易出错。因为如果写错成if(3 = num)
就会报错因为3是常量不能改变常量的值,而代码1中的表达式写错就不会报错。这些小细节就可以体现我们写代码的level。
switch语句
switch语句也是一种分支语句,常常用于多分支的情况。例如:判断今天是星期几,输入1,输出星期一,输入2,输出星期二,以此类推到输出星期日。我们可以用if else if else
,但这样写起来太复杂了,这个时候我们就需要使用switch
了。swtich
语法结构
swtich(整形表达式)
{
语句项:
}
语句项是什么呢?
case 整形常量表达式:
语句;
例如:
int main(){int day = 0;printf("输入今天的天数\n");scanf("%d", &day);switch (day){case 1:printf("星期1");case 2:printf("星期2");case 3:printf("星期3");case 4:printf("星期4");case 5:printf("星期5");case 6:printf("星期6");case 7:printf("星期7");}return 0;}
我们发现上面的代码并没有实现我们想要的分支逻辑,因为当我们输入1时,输出的结果为星期1到7,这是因为我们没有设置分支的出口break。
int main(){int day = 0;printf("输入今天的天数\n");scanf("%d", &day);switch (day){case 1:printf("星期1");break;case 2:printf("星期2");break;case 3:printf("星期3");break;case 4:printf("星期4");break;case 5:printf("星期5");break;case 6:printf("星期6");break;case 7:printf("星期7");break;}return 0;}
所以我们就了解到了,在switch语句中case决定分支的入口,break决定分支的出口。还有值得我们注意的是switch
语句中必须使用整形表达式,浮点型不行会报错,字符型也可以在switch中使用,因为字符在底层存储当中是以阿斯克码值的形式存储的。
break的使用
并不是每一个case
语句后面都需要加break
语句,可以根据需求使用break控制分支的出口。例如:
int main(){int day = 0;printf("输入今天的天数\n");scanf("%d", &day);switch (day){case 1:case 2:case 3:case 4:case 5:printf("工作日");break;case 6:case 7:printf("休息日");break;}return 0;}
这样我们就使用break
语句把语句列表划分为不同的分支部分。在提一下代码编写的风格,最好在最后一个case
后面加上一条break
语句,这样方便下一次编写。
default 的使用
如果表达式的值与所有的case
的标签值都不匹配,我们可以使用default
来提示用户,default
可以写在任何位置,并且一个switch
语句只能有一个default
子句。
注:最后在每个
switch
语句中都放一个default子句,并且可以在后面加上break
。
例如:
int main(){int day = 0;printf("输入今天的天数\n");scanf("%d", &day);switch (day){case 1:case 2:case 3:case 4:case 5:printf("工作日");break;case 6:case 7:printf("休息日");break;default:printf("输入错误");break;}return 0;}
这样当我们输入大于7的数字时就会给我们提示输入错误了。
#include <stdio.h>int main(){int n = 1;int m = 2;switch (n){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 = %d\n", m, n);return 0;}
最后给大家留下一道练习题,你知道最后结果是什么吗?答案是m = 5,n =3.你理解了嘛。
好了这就是我与大家分享的分支结构,如果写的不好希望大家提出建议,有错误也请大家指出,我希望可以和大家一起学习一起分享一起进步。