“花会沿途盛开,以后的路也是。” 今天我们一起来详细了解一下分支语句和循环语句。
分支和循环
1.什么是语句?
C语言中,语句可以分为以下5类:
- 表达式语句
- 函数调用语句
- 控制语句
- 复合语句
- 空语句
3 + 2;//表达式语句
printf("Hello World!\n");//函数调用语句
;//空语句-当我们需要一条语句,但这条语句什么都不需要做,那么我们可以选择空语句
这里我们重点介绍一下控制语句,控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们是由特定的语句定义符组成。 C语言中有9种控制语句:
1.条件判断语句即分支语句:
- if
- switch
2.循环执行语句
- while
- for
- do…while
3.转向语句
- goto语句
- break语句
- continue语句
- return语句
2.分支语句(选择结构)
2.1 if语句
语法结构:
if(表达式)//表达式结果为真,语句被执行;表达式结果为假,语句就不会被执行。
语句;
注:C语言中:0表示假,非0表示真
下面给出示例:
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d",&age);
if (age >= 18)
printf("成年人!\n");
return 0;
}
双分支if语句:
if(表达式)//表达式为真,语句1被执行;表达式为假,语句2被执行
语句1;
else
语句2;
下面给出示例:
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d",&age);
if (age >= 18)
printf("成年人!\n");
else
printf("未成年人!\n");
return 0;
}
多分支if语句:
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
下面给出示例:
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d",&age);
if (age < 18)
printf("未成年人!\n");
else if (age >= 18 && age <= 40)//这行的表达式不能写成18<=age<=40!!!
printf("青年!\n");
else if (age > 40 && age <= 65)
printf("中年!\n");
else
printf("老年!\n");
return 0;
}
这边给出一段代码:大家思考一下该段代码的执行结果是什么?
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if(b==2)
printf("haha!\n");
else
printf("hihi\n");
return 0;
}
这里,一眼看过去,大家的第一想法可能是屏幕上打印出hihi,但是实际上,应该什么都不打印,这里可以运行出来给大家看一下。
为什么会这样呢?这里就需要我们注意一下,一般情况下,else与离它最近的if匹配==,上面代码规范之后,应当如下:
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if(b==2)
printf("haha!\n");
else
printf("hihi\n");
return 0;
}
从上述代码,我们了解到在第一个if语句中的表达式a==1就不成立,所以会直接跳出下面的嵌套if语句,打印输出不会被执行。
2.1.1 if语句练习
1.判断一个数是不是奇数?
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
if (n % 2 == 1)
printf("Yes!\n");
else
printf("No!\n");
return 0;
}
2.输出1~100的所有奇数
//输出1~100的奇数
//方法一:
#include <stdio.h>
int main()
{
int n = 1;
while (n <= 100)
{
if (n % 2 == 1)
printf("%d ", n);
n++;
}
return 0;
}
//方法二:
#include <stdio.h>
int main()
{
int n = 1;
while (n <= 100)
{
printf("%d ", n);
n = n + 2;y
}
return 0;
}
2.2 switch语句
switch语句也是一种分支语句,常常用于多分支的情况。
比如:
输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期七
这里就出现了多分支的情况,用if语句来表示就较为复杂,要用到不一样的语法形式,这里我们就可以考虑switch语句。
switch(整形表达式)//表达式的结果必须是整型,根据表达式的值来选择相应的语句项来执行
{
语句项://语句项是一些case语句
//示例如下:
case 整型常量表达式:
语句;
}
对于上面的例子,我们给出下面这段代码:
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一!\n");
case 2:
printf("星期二!\n");
case 3:
printf("星期三!\n");
case 4:
printf("星期四!\n");
case 5:
printf("星期五!\n");
case 6:
printf("星期六!\n");
case 7:
printf("星期天!\n");
}
return 0;
}
那么,这样到底对不对呢?我们运行一下试试:
我们可以发现,当我们输入3的时候,它不仅仅打印了星期三,包含下面的几个语句项也都执行了,执行流程如下:
但是,我们并不希望它打印这么多出来,而是只希望打印一个星期三,那么我们应该如何调整呢?
这里我们就引出了switch语句中的break
2.2.1switch语句中的break
在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。
那么我们修改一下上述代码,改成我们希望的那个样子:
#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;
}
下面,我们对于这个示例,在给出变化,大家可以尝试写一下:当输入1-5的时候,输出weekday,当输出6-7的时候,输出weekend.下面给出我的代码:
#include <stdio.h>
int main()
{
int day;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("Weekday!\n");
break;
case 6:
case 7:
printf("Weekend!\n");
break;
}
return 0;
}
这个时候,还出现了一个问题,就是当我输入8的时候,能否给出一个提示呢?这里我们就引进了default子句。
2.2.2default子句
如果表达的值与所有的case标签的值都不匹配,这该怎么办?就是所有的语句都被跳过而已,程序不会被终止,也不会报错,在C中它不认为这是一个错误。但是,你不想忽略不匹配所有标签的表达式的值,该怎么办?你可以在列表中增加一条default子句,default子句可以出现在任何一个case标签可以出现的位置。当switch表达式的值并不匹配所有case标签的值的时候,这个default子句后面的语句就会执行。所以,每个switch语句中只能出现一条default子句。但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。 这里我们可以对上述代码做出修改:
#include <stdio.h>
int main()
{
int day;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("Weekday!\n");
break;
case 6:
case 7:
printf("Weekend!\n");
break;
default:
printf("选择错误!\n");
break;
}
return 0;
}
3.循环语句
- while
- for
- do while
3.1while循环
在前面,我们已经掌握了if语句:
if(条件)
语句;
我们知道当条件满足的情况下,if语句执行,否则不执行。但是这个语句只会执行一次。但是在日常生活中,我们发现同一件事情,可能需要我们做很多次。那么,我们应该怎么做呢?这里我们引入了while语句:
while(表达式)
循环语句;
while语句的执行流程为:先对表达式的值进行判断,如果表达式的值为真,则执行循环语句。然后再对表达式进行判断,只要为真,则执行循环体,以此往复,直到表达式的值为0,跳出循环。
下面我们给出一个示例:如果我们要在屏幕上打印1~10的数字,我们该如何做呢?
#include <stdio.h>
int main()
{
int n = 1;
while (n <= 10)
{
printf("%d ", n);
n++;
}
return 0;
}
上面已经了解到while的基本语法,接着我们再详细了解一下:
3.1.1while语句中的break和continue
对于下面这段代码,会输出什么样的结果呢?
#include <stdio.h>
int main()
{
int n = 1;
while (n <= 10)
{
if (n == 5)
continue;
printf("%d ", n);
n++;
}
return 0;
}
大家可以运行着试一试,我们可以发现出现了死循环,光标在4的后面一直闪烁。
这是为什么呢?n从1~4都不存在问题,但是当n=5的时候,遇到了continue,跳出了本轮循环,下面的语句没有被执行,此时,n依旧为5,又遇到了continue,跳出本次循环后面的代码,以此往复,n的值会一直为5,进入了死循环。
continue在while循环中的作用:continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是跳转到while语句的判断部分,进行下一次循环的入口判断。
还是上面的例子,当我们把n++放到if语句上面,会出现什么样的结果呢?
#include <stdio.h>
int main()
{
int n = 1;
while (n <= 10)
{
n++;
if (n == 5)
continue;
printf("%d ", n);
}
return 0;
}
不难看出,这里的n先进行+1的操作在打印输出,只有当n=5的时候跳出,所以会打印输出2~4、 6~11。
那么,continue我们已经有所了解,那么break又有什么作用呢?
//break语句:
#include <stdio.h>
int main()
{
int n = 1;
while (n <= 10)
{
if (n == 5)
break;
printf("%d ", n);
n++;
}
return 0;
}
这里,为什么只输出了1~4呢?这里,我们就给出break的用法!
break在while循环中的作用:其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。所有,while中的break就是永远终止循环的。
3.2getchar()和putchar()语句
getchar()-获取(输入)一个字符,读取字符成功的时候,返回字符的ASCII码值,读取失败或遇到文件末尾时就返回EOF(-1)
putchar()-输出一个字符
#include <stdio.h>
int main()
{
int ch = getchar();
putchar(ch);
return 0;
}
我们发现上述代码可以接受并打印出该字符!
下面,我们再看一看下面这段代码,看看它是用来干什么的?
#include <stdio.h>
int main()
{
int ch = 0;
while ((ch = getchar())!= EOF)
{
if (ch < '0' || ch>'9')
continue;
putchar(ch);
}
return 0;
}
对于这段代码的研究,我们就需要弄清楚ASCII码值,前面我们其实已经给大家看过了,这里我们在拿出来给大家看一下:
我们可以发现上面那段代码的意思是只打印字符0~9之间的字符,通过ASCII码表,我们发现对应的是数字字符0 ~9。这段代码的作用是只打印数字字符,跳过其他字符。通过下方的示例输出,我们也可以发现这个结果。在运行的时候,我们发现,这个光标会一直往下闪烁,程序没法退出,这个时候,我们可以按键盘上的ctrl+Z+回车键解决这个问题。
好啦,今天就学到这里啦,欢迎大家关注、点赞和评论!