循环语句

时间:2022-11-20 16:58:54

前言

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

1.循环语句

while

for

do while

1.1 选择结构图

循环语句

1.while循环

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

我们已经掌握了,if语句

if(条件)
语句;

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

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

1.2 while语句执行的流程:

循环语句

1.3 例

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

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

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

循环语句

上面的代码已经帮我了解了 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;
}

循环语句

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;
}

循环语句

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;
}

循环语句

总结:

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;

}

循环语句

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

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

循环语句

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

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

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

首先此代码核心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;
}

循环语句

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;
}

循环语句

2.3 for循环的执行流程图:

循环语句

现在我们对比一下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;
}

循环语句

这就和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;
}

循环语句

 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;
}

循环语句

此代码省略了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;
}

循环语句

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

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

循环语句

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;
}

循环语句

留言

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