文章目录
- 一、概览
- 二、分支结构
- 1. if语句
- 1.1 if
- 1.2 else与else if
- 1.3 嵌套if
- 2. switch语句
- 三、循环结构
- 1. while循环
- 2. for循环
- 3. do while循环
- 四、break,continue和goto语句
- 1. break语句
- 2. continue语句
- 2.1 while循环中的continue
- 2.2 for循环中的continue
- 3. 循环的嵌套
- 4. goto语句
一、概览
C语言是一种结构化的程序设计语言,包括三种结构:顺序结构、分支结构、循环结构。
其中,顺序结构是最简单的一种,即按照代码语句的上下顺序依次执行。今天着重介绍另外两种。
二、分支结构
分支结构,也可以叫做选择结构,分为if语句和switch语句两种
1. if语句
1.1 if
if语句的语法形式为`
if(表达式)
{
语句
语句
......
}
//tip:如果不加{},只会执行if下的第一条语句。所以有多条语句的话,一定记得加上{}哦。下同
若表达式为真(非0),则执行下列语句
为假(0),则不执行
1.2 else与else if
if(表达式)
{
语句
语句
......
}
else
{
语句
语句
......
}
//tip:如果有多个if和else,else总是和最近的if匹配
当if后的表达式为假不执行语句时,便跳过if,来到else执行它这里的语句
很好理解吧( •̀ .̫ •́ )✧
而如果你有更多情况需要分类,就可以加上else if
if(表达式1)
{
语句
......
}
else if(表达式2)
{
语句
......
}
else if(表达式3)
{
语句
......
}
else
{
语句
......
}
运行时,会自上而下依次检测。
表达式1为真,执行其下面的语句。为假,则检测表达式2;
表达式2为真,执行其下面的语句。为假,则检测表达式3;
表达式3为真,执行其下面的语句。为假,则执行else下的语句;
知道为什么叫“选择”结构了吧(乐)
举个栗子
#include<stdio.h>
int main()
{
int a;
printf("中野家的五姐妹你喜欢谁?\n");
scanf("%d",&a);
if(a==1)
printf("中野一花\n");
else if(a==2)
printf("中野二乃\n");
else if(a==3)
printf("中野三玖\n");
else if(a==4)
printf("中野四叶\n");
else if(a==5)
printf("中野五月\n");
else //如果用户输入的不是1-5的情况
printf("查无此人()\n");
return 0;
}
结果:
1.3 嵌套if
有了上面的知识,我们还可以进一步尝试嵌套if,构成多重判断
举个栗子:输入一个整数,判断是整数,负数,还是0。再判断是奇数还是偶数
#include<stdio.h>
int main()
{
int a=0;
again:
printf("请输入一个整数:");
scanf("%d", &a);
if (a > 0) //判断a是不是正数
{
if (a % 2 == 0) //判断a是不是偶数
printf("%d是正数而且是偶数\n\n", a);
else //不是偶数那肯定是奇数了
printf("%d是正数而且是奇数\n\n", a);
}
else if (a < 0)
{
if (a % 2 == 0)
printf("%d是负数而且是偶数\n\n", a);
else
printf("%d是负数而且是奇数\n\n", a);
}
else //a既不是正数也不是负数,那就是0了
printf("%d是偶数\n\n", a);
goto again;
return 0;
}
这里的goto语句后面会讲到,先不用理解,我只是为了方便将几种情况放到一起展示
结果:
灰常简单
不过,如果要嵌套更多的if语句,就需要梳理好逻辑关系,不然就可能会把结果弄错
2. switch语句
switch语句是if…else语句的一种特殊形式,对于有多种判断条件的情况,它可以把else if改成更简洁的形式
执行方式是:根据表达式不同的值,执行相应的case的分支。如果没有相应的case,就执行default分支
switch(表达式)
{
case 结果1:
语句1
break;
case 结果2:
语句2
break;
......
default:
语句3
//tip:其实case和default没有严格的顺序要求,满足需求即可,不过一般习惯把default放在最后
}
注意:
1. switch后的表达式必须是整型表达式
2. case后的值,必须是整型常量表达式
3. break的作用是执行完一个case下的语句后可以跳出switch。没有break的话,比如算出结果1,执行完语句1,会继续向下执行语句2,直到语句3结束,这可能就不是我们要的结果了。
再来个栗子: 输入1-7的一个数字,判断对应的星期几是工作日还是休息日
如果你没有加break:
#include <stdio.h>
int main()
{
int day;
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");
default
printf("错误\n");
}
return 0;
}
结果就不对
所以一定要记得break啊!!
#include <stdio.h>
int main()
{
int day;
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;
default
printf("错误\n");
break; //其实这个break加不加无所谓,因为它在最后面
}
return 0;
}
这样结果就没问题了
当然,刚才说到,没有break的话它会自上而下运行,所以其实可以把代码简化成这样:
#include <stdio.h>
int main()
{
int day;
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;
default
printf("错误\n");
}
return 0;
}
结果也是没问题的,就不再演示了o( ̄▽ ̄)d
三、循环结构
循环语句有三种:while,for,do while
1. while循环
while的语法形式为:
while(表达式)
{
语句
.......
}
若表达式为真,则执行下列语句,执行完再判断表达式真假,为真再执行…如此循环。
若表达式为假,则结束while语句。
举个栗子:打印1~666的所有整数
#include <stdio.h>
int main()
{
int i=1;
while(i<=666)
{
printf("%d ",i);
i++;
}
return 0;
}
很顺利
2. for循环
for循环是用的最多的,语法形式如下:
for(表达式1;表达式2;表达式3)
{
语句
.......
}
表达式1用于循环变量的初始化
表达式2用于循环结束条件的判断
表达式3用于循环变量的调整
流程:首先执行表达式1,初始化变量。接下来判断表达式2的真假,为真则执行下列语句,为假则结束循环。语句执行完后,再执行表达式3,调整变量,再去判断表达式2的真假…如此循环。能看出来,表达式1只被执行了一次,剩下的全是“表达式2——语句——表达式3”的循环。
还是这个栗子:打印1~666的所有整数
#include <stdio.h>
int main()
{
int i=0;
for( i=1 ; i<=666 ; i++ )
{
printf("%d ",i);
}
return 0;
}
来看看结果:
下次还填非常简单( ゜▽ ゜)つロ
3. do while循环
do while循环的语法形式:
do
{
语句
......
}
while(表达式)
它的运行流程有些不一样:
前面的while和if语句,都是先判断表达式的真假,再执行语句。
而do while循环中,首先执行语句,再去判断表达式的真假,为真则继续执行语句,为假则结束循环。
所以在do while语句中,循环体是至少执行一次的,某些场景下可能会用到这个特性。
再来:打印1~666的所有整数
#include <stdio.h>
int main()
{
int i=1;
do
{
printf("%d ",i);
i++;
}
while(i<=666);
return 0;
}
没毛病
四、break,continue和goto语句
1. break语句
在循环执行的过程中,如果遇到某些情况需要终止循环,就可以用到break语句。
只要break被执行,就会直接跳出其所处的循环,继续往后执行。
我们以for循环举例,看懂后另外两种循环就是照猫画虎
在之前的栗子中,我们做一些修改
#include <stdio.h>
int main()
{
int i=0;
for( i=1 ; i<=666 ; i++ )
{
if(i==67) //新加
break; //新加
printf("%d ",i);
}
return 0;
}
显然,这样的话结果只会打印到66
2. continue语句
continue可以跳过本次循环中它后面的代码,而直接进行下一次循环的判断
但在while语句和for语句中,效果有所不同~
(do while语句和while语句中continue效果类似)
2.1 while循环中的continue
我们还是改一下上面的栗子
#include <stdio.h>
int main()
{
int i=1;
while(i<=666)
{
printf("%d ",i);
continue;
i++;
}
return 0;
}
结果是死循环打印1
这是因为每次循环中 i++ 都被跳过了,i 一直是1,i <= 666恒成立,就导致了死循环
2.2 for循环中的continue
#include <stdio.h>
int main()
{
int i=0;
for( i=1 ; i<=666 ; i++ )
{
if(i==10)
continue;
printf("%d ",i);
}
return 0;
}
10被跳过了,但后面的数正常打印
这是因为continue跳过了后面的 printf,来到 i++,i 变成了11,不满足 if 的条件,continue不再执行了
ok很好理解ヾ(◍°∇°◍)ノ゙
3. 循环的嵌套
有了上面的知识,我们就可以来试试用嵌套循环语句来实现复杂的要求了
栗子:打印1~200之间所有的素数
解析:
1.找出1~200间所有的数
2.对于每一个数 i ,如果在2~ i-1间存在一个整数 j 能整除 i ,那么 i 就不是素数
展示:
#include <stdio.h>
int main()
{
int i = 0;
for(i=1 ; i<=200; i++)//循环产⽣1~200的数字
{
int j = 0;
int flag = 1;//假设i是素数
for(j=2; j<=i-1 ; j++)//循环产⽣2~i-1之间的数字
{
if(i % j == 0)
{
flag = 0;//i不是素数
break;
}
}
if(flag == 1)
printf("%d ", i);
}
return 0;
}
4. goto语句
最后我们来介绍下之前提过的goto语句
goto语句可以实现在同一个函数内跳转到设置好的标号处,就像山里灵活的狗一样。
再来个栗子:
#include<stdio.h>
int main()
{
落羽:
printf("乐");
goto 落羽;
printf("喜");
return 0;
}
这样,每次运行到“goto 落羽”,都会回到最上面“落羽:”,如此死循环打印“乐”,而不会打印“喜”
但如果使用不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以我们的建议是能不用尽量不去使用。
但是 goto 语句也不是一无是处,在多层循环的代码中,写一次break只能跳出一层循环。如果想快速跳出,使用goto就非常的方便了。
for(...)
{
for(...)
{
for(...)
{
if(...)
goto name;
}
}
}
name:
//name是可以任起的,只是一个对应关系
本篇完~~谢谢阅读
请大家看可爱流萤