前言
上一篇博客我们已经讲解了分支语句,本章我们将继续讲解循环语句,分支语句和循环语句相辅相成,二者有着密切的关系
1.循环语句
while
for
do while
1.1 选择结构图
1.while循环
while语句我们在初识c语言中也已经讲解过了,忘记的可以去翻一翻博客
我们已经掌握了,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 循环失去控制。
- 建议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;
}
留言
如果有不正确的希望小伙伴们指正,欢迎评论区交流,如果喜欢就点赞收藏支持一下吧