目录
(3)、 do...while()循环中break和continue的作用
一、控制语句及其分类
控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种结构:顺序结构、选 择结构、循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。 可分成以下三类:
1. 条件判断语句也叫分支语句:if语句、switch语句;
2. 循环执行语句:do while语句、while语句、for语句;
3. 转向语句:break语句、goto语句、continue语句、return语句。
二、分支语句
1、if语句
(1)、if语句的结构介绍
//if条件语句
if(表达式)
语句;
//if else选择语句
if(表达式)
语句1;
else
语句2;
//多分支语句
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
😉补充一下:
如果表达式的结果为真,则该语句执行,在C语言中0表示假,非0表示真。如果条件成立,要执行多条语句,怎应该使用代码块。如下所示:
int main()
{
if(表达式)
{
语句列表1;
}
else
{
语句列表2;
}
return 0;
}
(2)、悬空else
浅浅问一下大家下面的两个代码运行结果如何?相同吗?
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("OK!\n");
else
printf("NO!\n");
return 0;
}
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
{
if(b == 2)
{
printf("OK!\n");
}
}
else
{
printf("NO!\n");
}
return 0;
}
显然第一个代码是没有输出结果的,第二个代码是会输出NO!由上面两个结果可知else是和离资金较近的if相匹配的。所以我们可以适当的使用{ }使代码的逻辑更加清楚,提高可读性😉
2、switch语句
(1)、案例引入
例如:
输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期日
如果写成 if...else if ...else if 的形式太复杂了,这样就有不一样的语法形式。
这就是switch 语句。
(2)、switch语句的结构
switch(整型表达式)
{
语句项;
}
语句项就是case语句:
case 整形常量表达式:
语句;
对于上方案例可以由switch语句来表达:
#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>
//switch代码演示
int main()
{
int day = 0;
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;
}
为什么可以只在case:5后面写printf("weekday\n");这是由于switch语句中,运行逻辑是从第一个case语句开始执行,执行完会继续执行第二个case语句,知道遇到break才会跳出switch语句。
(3)default子句在switch语句中的作用
当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。 所以,每个switch语句中只能出现一条default子句。 但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。
#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;
default:
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;
}
上面的代码可以看出default的位置在case:3后面,但是只要day不符合所有的case子句,都会运行default子句。而却default的运行流程也是和case相同的,当运行完case:3子句后,如果没有break会继续运行default子句,和case相同。按顺序进行运行。用代码表示如下:
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
switch (a)
{
case 1:
printf("houhouhou\n");
case 2:
printf("heiheihei\n");
case 3:
printf("hehehe\n");
default:
printf("输入错误\n");
case 4:
printf("hahaha\n");
}
return 0;
}
运行结果可以看出来default的的位置与运行次序是一致的,但是当所有的case都不符,则会运行default子句。同时也可以看出来没有break语句switch里面 会一直从头运行到结尾,而不会结束,所以break咋switch中起着很重要的作用。
三、循环语句
1、while循环
(1)、while循环的执行流程
由图可以可看出来,while循环中当条件成立(条件非零)则进入循环,执行循环语句,在进行下次条件判断,当条件为假(条件为零)则结束循环。
(2)、while循环中break的作用
可以看出来在while循环中只要遇到break,就停止后期的所有的循环,直接终止循环。 所以:while中的break是用于永久终止循环的。
(3)、while循环中的continue
可以看到输出到4之后不再有输出了,是因为当运行到i加到5就进入了if语句,运行了continue,结束了本次循环进入下一次循环此时i依然还是5所以还是进入if语句,这样就是光标一直闪着,由于i一直是5,没有达到while循环结束,就一直在运行。continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行, 而是直接跳转到while语句的判断部分。进行下一次循环的入口判断
2、for循环语句
(1)、for循环的执行流程图
int i = 0;
//实现相同的功能,使用while
i=1;//初始化部分
while(i<=10)//判断部分
{
printf("hehe\n");
i = i+1;//调整部分
}
//实现相同的功能,使用for
for(i=1; i<=10; i++)
{
printf("hehe\n");
}
可以看出来在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较 远,这样 查找修改就不够集中和方便。所以,for循环的风格更胜一筹;for循环使用的频率也最高。
(2)、for循环的语法
for(表达式1; 表达式2; 表达式3)
循环语句;
表达式1
表达式1为初始化部分,用于初始化循环变量的。
表达式2
表达式2为条件判断部分,用于判断循环时候终止。
表达式3
表达式3为调整部分,用于循环条件的调整。
(3)、for循环中break和continue的作用
for循环中也有break和continue控制,他们的意义和在while循环中是一样的。
//代码1
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5)
break;
printf("%d ",i);
}
return 0;
}
//代码2
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5)
continue;
printf("%d ",i);
}
return 0;
}
(4)、for循环的省略(变种)
#include <stdio.h>
int main()
{
//代码1
for(;;)
{
printf("hehe\n");
}
//for循环中的初始化部分,判断部分,调整部分是可以省略的。
//代码2
int i = 0;
int j = 0;
//这里打印100个hehe
for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
printf("hehe\n");
}
}
//代码3
int i = 0;
int j = 0;
//如果省略掉初始化部分,这里打印10个hehe,当第一次的j变量的for循环运行结束进行下一次的时候,由于初始化部分被省略,所以j还是10,就跳出循环,直到i变量的for循环结束后,运行终止。但是诗词输出之后就再没有输出了。
for(; i<10; i++)
{
for(; j<10; j++)
{
printf("hehe\n");
}
}
//代码4:使用多余一个变量控制循环
int x, y;
for (x = 0, y = 0; x<2 && y<5; ++x, y++)
{
printf("hehe\n");
}
return 0;
}
3、do...while()循环
(1)、do...while()循环的语法
do{
循环语句;
}while(表达式);
do循环中表达式成真则继续运行下一轮循环,当表达式为假,则循环结束
(2)、do...while()循环的执行流程图
循环至少执行一次
(3)、 do...while()循环中break和continue的作用
break结束循环,continue结束本轮循环进入到下一轮(几乎所有的循环情况中,这两者的作用都是如此)。
四、转向语句
1、goto语句
goto语句最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。下方举例:
for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
…
error:
if(disaster)
// 处理错误情况
如果不使用goto语句则需要定义一个辅助变量,用break语句依次跳出对应for循环,直到跳出到最外层。效率显而易见的低于goto语句。
但是goto语句属于无条件跳转语句,用于改变语句执行顺序。一旦滥用goto语句将会导致逻辑混乱,导致系统崩溃等问题!!!
2、return语句
int function(int a, int b)
{
if (a > 0)return a;
else if (b < 0)return b;
else return;
}
return的作用就是结束,跳转:结束本函数,跳转到外函数调用本函数的地方并带回返回值。
今天的分享就到这啦😉
如果我的文章对您有帮助,
请 “点赞” “收藏” “关注”
一键三连哦!
想了解更多知识请前往故里♡927的博客
如果以上内容有什么问题,欢迎留言,大家一起学习,共同进步。
我们下期见😉~~