首页 > 其他分享 >循环语句

循环语句

时间:2022-11-20 17:02:45浏览次数:39  
标签:语句 continue int while 循环 printf

前言

上一篇博客我们已经讲解了分支语句,本章我们将继续讲解循环语句,分支语句和循环语句相辅相成,二者有着密切的关系

1.循环语句

while

for

do while

1.1 选择结构图

循环语句_for循环

1.while循环

while语句我们在初识c语言中也已经讲解过了,忘记的可以去翻一翻博客

我们已经掌握了,if语句

if(条件)
语句;

当条件满足的情况下,if语句后的语句执行,否则不执行。 但是这个语句只会执行一次。 由于我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。 那我们怎么做呢? C语言中给我们引入了: while 语句,可以实现循环。

//while 语法结构
while(表达式)
循环语句;

1.2 while语句执行的流程:

循环语句_continue_02

1.3 例

比如我们实现: 在屏幕上打印1-10的数字。

此段代码最重要的就是i <= 10判断条件了

int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i++;
}
return 0;
}

循环语句_continue_03

上面的代码已经帮我了解了 while 语句的基本语法,那我们再了解一下:

1.4 while语句中的break和continue

1.4.1break介绍

break我们在选择语句中提过一嘴,意思差不多

总结:

break在while循环中的作用:

其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。

所以:while中的break是用于永久终止循环的。

//while语句中的break和continue
//break 代码实例
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
break;
printf("%d ", i);
i = i + 1;
}
return 0;
}

循环语句_continue_04

1.4.2 continue介绍

可见只输出了1234那为什么不输出后面的数字呢,因为continue的功能是结束本次循环,即执行到continue时其后面的代码不在执行直接跳过进入下一次循环,因为我们的i = i + 1;写在后面,所continue直接跳过程序陷死,因为i一直等于5,等于5就会执行出continue,后续代码又无法执行,因而陷死

1.4.2.1 continue 代码实例1

//continue 代码实例1
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
printf("%d ", i);
i = i + 1;
}
return 0;
}

循环语句_break_05

1.4.2.2 continue 代码实例2

这个代码就很好的解决了例1代码陷入死循环的问题,因为他将i = i + 1;放在了前面

//continue 代码实例2
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
i = i + 1;
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}

循环语句_for循环_06

总结:

continue在while循环中的作用就是:

continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行, 而是直接跳转到while语句的判断部分。进行下一次循环的入口判断

再看几个代码:

核心ch= getchar()) != EOF,当我们使用Ctrl+z时getchar()会获取一个EOF的标志,EOF时文件结束的标志,从而循环结束

int main()
{
int ch = 0;
while ((ch= getchar()) != EOF)
{
putchar(ch);

}
//int ch = getchar();//能够获取键入字符
//putchar(ch);//输出键入字符
////printf("%c\n", ch);
return 0;

}

循环语句_i++_07

这个代码的作用是:只打印数字字符,跳过其他字符的,核心利用ascii码大小比对,只要不是数字范围内的ascii码值都会执行continue跳出本次循环,并且不输出

//理解代码意思
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
{
if (ch < '0' || ch>'9')//输读出字符0-9
{
continue;
}
putchar(ch);
}
return 0;
}

循环语句_break_08

到现在可能有小伙伴就有疑问了,我们了解这个有什么用呢

来和我一起实例化了解一下吧

我们写一个确认密码的代码代码流程很简单不做过多解释

首先此代码核心while ((ch = getchar()) != '\n'){ ;//空语句}就是这个,他有什么用呢,首先,我们在scanf输入密码是最后回车,这就是问题的重点,一旦我们回车就会在缓冲区留下一个‘\n’但scanf不会将其读走,而ret = getchar();//接收Y/N则会读走‘\n’这样我们的代码逻辑就错了不能达到我们想要的效果,为了避免这个问题,我们写一个//循环读取了缓冲区的“\n”的代码将缓冲区清空,为ret = getchar();清楚障碍,这段代码就恰恰体现了getchar()的特性和缓冲区的关系,遗留回车问题,是一个非常不明显的错误,大家一定一定要注意

//实例getchar()的作用 例题密码输入
int main()
{
int ret = 0;
int ch = 0;
char password[20] = { 0 };//存储密码
printf("请输入密码:");
scanf("%s", &password);//输入密码,存放在password数组中

//此时缓冲区中还有一个“\n”(因为在输入密码后敲了一下回车留下的)

//所以读取“\n”使缓冲区为空
//循环读取了缓冲区的“\n”,如果我读取的字符不是'\n',我就一直读缓冲区,直到读到了'\n'跳出循环
while ((ch = getchar()) != '\n')
{
;//空语句
}
printf("请确认密码(Y/N):");
ret = getchar();//接收Y/N
if (ret == 'Y')
{
printf("密码正确\n");
}
else
{
printf("密码错误\n");
}
return 0;
}

循环语句_break_09

2. for循环

我们已经知道了while循环,但是我们为什么还要一个for循环呢?

首先来看看for循环的语法:

2.1 语法

for(表达式1; 表达式2; 表达式3)
循环语句;

表达式1

表达式1为初始化部分,用于初始化循环变量的。

表达式2

表达式2为条件判断部分,用于判断循环时候终止。

表达式3

表达式3为调整部分,用于循环条件的调整。

2.2 实际的问题:

使用for循环 在屏幕上打印1-10的数字

//使用for循环打印1-10
#include <stdio.h>
int main()
{
int i = 0;
//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}

循环语句_i++_10

2.3 for循环的执行流程图:

循环语句_i++_11

现在我们对比一下for循环和while循环

int i = 0;
//实现相同的功能,使用while
i=1;//初始化部分
while(i<=10)//判断部分
{
printf("hehe\n");
i = i+1;//调整部分
}

//实现相同的功能,使用while
for(i=1; i<=10; i++)
{
printf("hehe\n");
}

可以发现在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样 查找修改就不够集中和方便。所以,for循环的风格更胜一筹;for循环使用的频率也最高。

2.4 break和continue在for循环中

我们发现在for循环中也可以出现break和continue,他们的意义和在while循环中是一样的。 但是还是有些差异:

同样碰到break语句直接结束循环

//代码1
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5)
break;
printf("%d ",i);
}
return 0;
}

循环语句_break_12

这就和while循环结合continue不同了,因为for加了continue一样可以输出后面的数组,原因在于for循环又自增条件i++

//代码2
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}

循环语句_for循环_13

 2.5 for语句的循环控制变量

建议:

 1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。

  1. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。

int i = 0;
//前闭后开的写法
for(i=0; i<10; i++)
{}
//两边都是闭区间
for(i=0; i<=9; i++)
{}

2.6 一些for循环的变种

int main()
{
//代码1
for (;;)
{
printf("hehe\n"); //死循环
}
return 0;
}
//输出多少个hehe
int main()
{
//代码2
int i = 0;
int j = 0;
int count = 0;
//这里打印多少个hehe?
for (i = 0; i < 10; i++)
{
for (j = 0; j < 10; j++)
{
printf("hehe\n");
count++;
}
}
printf("%d",count);
return 0;
}

循环语句_while循环_14

此代码省略了for循环初始化,当i=0时进入第二个for循环,打印10个hehe此时j=10;但是重点来了,这个j=10并没有被销毁重置,而是保留下来了,所以当i=1时再次进入,第二个for循环便不再输出以此类推

//打印多少hehe
int main()
{
//代码3
int i = 0;
int j = 0;
int count = 0;
//如果省略掉初始化部分,这里打印多少个hehe?
for (; i < 10; i++)
{
for (; j < 10; j++)
{
printf("hehe\n");
count++;
}
}
printf("%d", count);
return 0;
}

循环语句_for循环_15

又多个变量控,只有两个条件都符合时才进入循环体

//打印多少hehe
int main()
{
//代码4-使用多余一个变量控制循环
int x, y;
for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
{
printf("hehe\n");
}
return 0;
}

循环语句_break_16

3.面试题

很明显0次,有的小伙伴就说了,这部很简单吗,其实则不然,你仔细看,循环的判断条件k=0,而不是k==0,k=0是赋值,相当于k为0了,为0则为假,循环压根不进去

//请问循环要循环多少次?
#include <stdio.h>
int main()
{
int i = 0;
int k = 0;
for(i =0,k=0; k=0; i++,k++)
k++;
return 0;
}

循环语句_i++_17

留言

如果有不正确的希望小伙伴们指正,欢迎评论区交流,如果喜欢就点赞收藏支持一下吧













标签:语句,continue,int,while,循环,printf
From: https://blog.51cto.com/u_15784725/5871594

相关文章

  • java——异常——异常注意事项:finally有return语句——如果finally有return语句,永远
                             异常注意事项:finally有return语句如果finally有return语句,永远返回finally中的结果,......
  • python面试题常用语句
    一、比较与交换1.比较并输出大的print(aifa>belseb)2.交换两个元素a,b=b,alist1[i],list[j]=list1[j],list[i] 二、排序1.字符串排序s='aaccbgd'pri......
  • js 事件循环中宏任务和微任务执行顺序
    asyncfunctionasync1(){console.log("async1start");//2awaitasync2();console.log("async1end");//6}asyncfunctionasync2(){console......
  • Spring源码循环依赖
    一级缓存:存储单例Bean的Map对象。二级缓存:为了将成熟Bean和纯净Bean分离开来,职责更明确,代码更容易维护,避免由于多线程的环境下读取到不完整的Bean。二级缓存不能存储原生......
  • C语言———链表的创建、循环删除和循环插入系统
    参考主要是谭向强的那本《C程序设计》和B站上的小甲鱼的视频,视频的话B站上搜就有,就不把链接放上了。背景:     前两天在学习C语言的过程中又重新学习了一......
  • JS语法语句、变量
    <!DOCTYPEhtml><html><head><metacharset="utf-8"><title></title></head><body><!--语法与语句,变量--><!--......
  • orcale笔记03-DML语句
    insertinto:插入数据全表插入:insertinto表名values(值1,值2...);部分列插入:insertinto表名(列1,列2...)values(值1,值2...)从其他表中复制数据:insertin......
  • 序列数的重复与循环(Power Query)
    问题:为成员分组,每组4人(重复),每人一个编号(循环)let源=Excel.CurrentWorkbook(){[Name="表1"]}[Content],重复=Table.TransformColumns(Table.AddIndexColumn(......
  • 序列数的重复与循环
    问题:如何生成一组重复与循环的序列数,如图所示。 函数公式解决:重复 =INT(ROW(A5)/5)(5为重复次数)循环 =MOD(ROW(A5),5)+1(5为循环值)思路:Row函数是返回参数所在单......
  • 重构之卫语句
    如果代码嵌套层次过多,阅读内层逻辑时需要仔细查看外层代码信息,增加了理解代码逻辑难度。通过使用卫语句,可以有效减少代码嵌套层次,逻辑会变得更清晰。先看一段嵌套层次比较......