在现实生活中,我们经常会遇到作出选择和判断的时候,在C语言中也同样要面临作出选择和判断的时候,所以今天,就让我们一起来了解一下,C语言是如何作出选择判断的。
目录
1.何为语句?
2.if语句
2.1 if语句的语法结构
2.2 else悬空
2.3 if的书写形式
3.switch语句
3.1 switch的语法结构
3.2 default子句
1.何为语句?
首先,我们要明白什么是语句。在C语言中,语句可以分为以下五类:
表达式语句(比如a = 6;)、函数调用语句(比如printf("%d",a);)、控制语句(分支语句就是其中一种)、复合语句(例如{x = 6;y = 4;z = x + y;printf("%d",z);})、空语句(只有一个分号)。
控制语句即用来实现对程序流程的选择、循环、转向和返回等进行控制(C语言支持顺序结构、选择结构和循环结构三种结构)。C语言共有9种控制语句,可大致分为以下三类:
1.分支语句,也叫条件判断语句:if、switch;
2.循环语句:do while语句、while语句、for语句;
3.转向语句:break语句、goto语句、continue语句、return语句。
今天要讲的就是控制语句中的分支语句,也就是if和switch的语法。
话不多说,我们开始吧!
2.if语句
2.1 if语句的语法结构
首先我们了解一下if语句的使用格式:
if (表达式)
语句1;
else
语句2;
//多分支
if (表达式1)
语句1;
else if (表达式2)
语句2;
else
语句3;
return 0;
表达式的结果为真,则语句执行,在C语言中,0为假,非0即真。
现在我们来演示一下,实现对年龄的判断,18岁及以上就打印"成年人",18岁以下就打印"未成年",小于0则提示"输入有误"。具体代码如下:
#include<stdio.h>
//代码1
int main()
{
//定义一个名为age的整型变量,
int age = 0;
//输入年龄
scanf("%d", &age);
//开始判断
if (age >= 18)
printf("成年人");
else if (age < 0)
printf("输入有误");
//不是>=18也不是<0,那么这里的范围就应该是0到18啦
else
printf("未成年");
}
我们可以发现,每一个if语句后,都跟着一条语句,只要前面条件成立,那么这条语句就会被执行,那如果条件成立,我们要执行多条语句呢?我们又应该怎么写?
我们可以根据上面的代码,再补充一下,具体如下:
#include<stdio.h>
//代码2
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)
{
printf("%d岁", age);
printf("是成年人");
}
else if (age < 0)
printf("输入有误");
else
{
printf("%d岁", age);
printf("未成年");
}
return 0;
}
可以看到,不同于代码1,代码2用一对{}将if语句后的多条语句给括起来,这个代码块也就是上面所提到的复合语句,用一对{}括起来的多条语句。所以,当条件成立时需要执行多条语句时,需要把要执行的语句写入{}中,如果没有,那么条件成立时,if语句只会执行在它之后的第一条语句(but我实验了一下,程序直接报错,无法运行。)
事实上只执行一条语句的话,也可以选择使用{},可以让代码看起来更加容易阅读,逻辑更清晰,后面会提到if语句的书写形式,uu们可以比较一下。
2.2 else悬空
uu们可以看一下下面这段代码,大家认为运行结果会是什么呢?
#include<stdio.h>
//代码1
int main()
{
int a = 0;
int b = 1;
if (a == 2)
if (b == 1)
printf("gg\n");
else
printf("dd\n");
return 0;
}
当时在学这个的时候,我就踩坑啦,以为程序会打印出"dd";
事实上,这个程序的运行结果是什么都不打印。
为什么呢?我们来看一下代码2:
#include<stdio.h>
//代码2
int main()
{
int a = 0;
int b = 1;
if (a == 2)
{
if (b == 1)
{
printf("gg\n");
}
}
else
{
printf("dd\n");
}
return 0;
}
代码2的运行结果就是"dd"啦,阅读代码2,我们可以清晰地观察到不同if 和else语句之间的从属关系,而在代码1中,else应该是匹配它上面的if(b == 1)的,也就是执行if(b == 1)和else的前提是,if(a == 2)为真。因此当if(a == 2)为假时,下面所有的语句都不会被执行,程序自然就什么都不打印了。
从这两段代码的对比中我们可以学到,else是和离它最近的if相匹配的。
2.3 if的书写形式
#include<stdio.h>
//代码1
int main()
{
int a = 0;
if (a == 1) {
printf("dd");
}
else {
printf("gg");
}
}
//代码2
int main()
{
int a = 0;
if (1 == a)
{
printf("dd");
}
else
{
printf("gg");
}
}
通过上面两段代码的对比,可以看到代码2的逻辑更加清晰,更容易读懂,且不容易出错。
不仅是if语句,在编写程序的时候,我们也要做到严谨、简洁的书写形式,必要时适量加入注释,方便后期重新阅读代码。
3.switch语句
switch语句常常使用于多分支的情况下,当你需要多个条件判断时,用if...else if...else if...else就显得有点冗杂且麻烦了,这时候就需要我们的switch语句发挥作用了。
3.1 switch的语法结构
同样,我们需要先了解一下switch语句的使用格式:
switch (变量表达式)
{
case (常量1):
语句1;
case (常量2):
语句2;
......
}
不同于if判断真假,switch语句是通过判断变量表达式与其中一个case语句中的常量是否相符,相符时就执行这个case语句后面的语句,并依次执行后面所有case语句中的语句。
以上面代码为例,即当变量表达式的值等于常量1时,就会执行语句1,紧接着执行语句2。
但是如果我们只想执行语句1不想执行语句2呢?
很显然,这个逻辑并不能满足我们实现分支,所以,switch还需要搭配关键字break一起使用;
现在我们来写一个程序,输入1~7,对应输出周一到周日,代码如下:
#include<stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期日\n");
break;
}
return 0;
}
假设现在输入3,程序开始运行,此时day = 3,switch找到和day = 3相等的case 3,开始执行case 3 后面的语句,即打印"星期三",紧接着执行break语句,跳出switch语句,程序结束。
运行结果会不会和我们想的一样呢?我们运行一下看看:
运行结果和我们判断的一样,证明我们的思路是没问题的,为了让大家更清晰地感受到break语句在switch语句中的作用,我们现在改变一下需求,输入1~5,打印工作日,输入6或7,打印休息日,代码实现如下:
#include<stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
}
return 0;
}
假设输入1,此时day = 1,程序开始执行case1后的语句,但case1后是没有语句的,所以程序开始执行case2的语句,以此类推,程序会依次执行下去直到case5这里打印"工作日",然后执行break语句跳出switch语句,程序结束。
可以看到,break语句的作用就是将不同case下的语句划分为不同分支。
那么,如果我们输入的不是1~7的数字呢?
这里就引出了和switch语句配套使用的另一个关键字:default。
3.2 default子句
当switch变量表达式和所有case标签的常量都不相符时,switch就会跳过所有的case语句,程序不会报错,也不会终止。
如果我们不想忽略switch变量表达式和所有case标签的常量不匹配的情况,我们就可以在语句列表中增加一条default子句,这个default语句可以出现在语句列表的任意一个位置,当switch变量表达式的值和所有case标签的值不相符时,switch语句就会执行default子句,因此,每个switch语句中只能出现一条default子句。
还是以上面的例子作为示范,我们加入一条default子句,当输入的值不是1~7时,打印"输入有误!",具体代码如下:
#include<stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
//这里故意将default放到中间,是想告诉大家default子句是可以出现在语句列表任意一个位置的
//但我比较习惯放在结尾
default:
printf("输入有误!\n");
break;
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
}
return 0;
}
我们输入8,看一下运行结果:
在每个switch语句中都放入一条default子句是一个好习惯,也可以在后面加一个break,这样更能体现程序逻辑上的严密性。
以上就是C语言分支语句的所有内容啦,事实上这些语句还能够嵌套调用,这就需要大家勤加练习,多刷题,熟练掌握语句的使用方法啦!
下期内容会给大家介绍一下C语言的循环语句,敬请期待咯^_^
如有错误,还请大佬们及时指出(salute)
如果你觉得这篇文章对你有帮助的话,麻烦动动小手为我点个赞哦OvO