> 文档中心 > 循环语句这些知识点你真的会了吗?(1)

循环语句这些知识点你真的会了吗?(1)

循环语句

  • 前言
  • 1.while循环
    • 1.1.while语句中的break
    • 1.2.while语句中的continue
  • 2.for循环
    • 2.1.for语句中的break和continue
  • 3.do...while()循环
    • 3.1.do while循环中的break和continue
  • 一些话

前言

接上一篇(C语言第六课)
知道控制语句有分支语句和循环语句,这次重点了解循环语句的语法与用法。循环语句分为while循环语句,for循环语句和do while循环语句,其中for语句用到最多的循环语句。

1.while循环

语法结构:

while(表达式)      循环语句;

while语句的循环流程图
在这里插入图片描述
例如:在屏幕上打印1-10的数字。

#includeint main(){int i = 1;//初始化变量iwhile (i <= 10)//判断变量i是否小于等于10,如果小于等于10,则继续循环;否则结束循环{    //循环体printf("%d ", i);//打印i的值i++;//即i = i + 1//使i由1增加到11}return 0;}

在这里插入图片描述
那么大概了解了while语句的基本语法,那再了解一下:

1.1.while语句中的break

while语句中break是用于永久的终止循环。但是一次只能终止一个循环

#include int main(){int i = 1;//初始化变量iwhile (i <= 10)//判断变量i的值{if (i == 5)//判断变量i的值是否等于5,如果不等于则if语句为假,不执行break,如果为真,则执行breakbreak;printf("%d ", i);i = i + 1;}return 0;}

在这里插入图片描述
由代码和结果可知,当变量i=5后,if语句为真,则执行break命令,此时结果就只为1 2 3 4,由此可见执行break语句后直接结束了循环。故break在while循环中的作用:

其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。
所以:while中的break是用于永久终止循环的。

如果把break换成continue会怎么样?

1.2.while语句中的continue

while语句中的continue作用:跳过本次的循环后面的代码,直接进行下一次循环的判断部分,进行下一次的判断。

#include int main(){int i = 1;//初始化while (i <= 10)//判断{    //循环体if (i == 5)continue;printf("%d ", i);i = i + 1;}return 0;}

在这里插入图片描述
此时结果是1 2 3 4死循环,因为当i=5时候,if语句为真,执行continue命令,直接跳过本次循环,即跳过了打印i的值和i++,直接进行下一次循环,即i依然是5,故会继续死循环下去。
如果把i++放到if前面,结果会发生变化

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

在这里插入图片描述
此时结果为2 3 4 6 7 8 9 10 11。直接跳过了5,因为当i=5时候,if语句为真,则执行continue命令,即跳过本次循环中continue后面的代码,直接进行下一次循环的判断。

#includeint main(){int ch = 0; ch = getchar();//获取一个字符,并用该字符的ASCII码值放到ch中printf("%c\n", ch);putchar(ch);//打印字符return 0;}

在这里插入图片描述

int getchar( void );//getchar()类型是int

循环语句这些知识点你真的会了吗?(1)

读取错误或文件结束条件,getchar返回EOF

其中EOF是end of file

在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~127,不可能出现-1,因此可以用EOF作为文件结束标志。
getchar函数从标准输入里读取下一个字符,返回类型为int型,返回值为用户输入的ASCⅡ码,出错返回EOF。即EOF的值是-1
ch=getchar();等待从键盘上输入一个字符,
putchar(ch);输出此字符,

#includeint main(){int ch = 0;while ((ch = getchar()) != EOF)//判断读到的字符是不是EOF,不是则循环,不是则结束循环putchar(ch);return 0;}

循环语句这些知识点你真的会了吗?(1)
在这里插入图片描述
按Crtl+z即可停止读取,即
在这里插入图片描述

  //举一个例子//假设密码是一个字符串#includeint main(){    char password[20] = { 0 };printf("请输入密码:>");scanf("%s", password);//123456printf("请确认密码(Y/N):>");int ret = getchar();if ('Y' == ret){printf("Yes\n");}else{printf("No\n");}return 0;}

在这里插入图片描述
此时直接输入了NO,并没有经过我们的确认,这是因为scanf只读取密码abcd,还剩余一个’/n’,那么getchar()不会等我们输入,直接读取‘/n’,/n不等于Y,导致直接打印NO。那么我们可以通过两种办法来改良。
方法一:

#includeint main(){    char password[20] = { 0 };printf("请输入密码:>");scanf("%s", password);//123456getchar();//读取了\nint ch = 0;printf("请确认密码(Y/N):>");int ret = getchar();if ('Y' == ret){printf("Yes\n");}else{printf("No\n");}return 0;}

在这里插入图片描述

在这里插入图片描述
由此可见,方法一在没有空格时候是可以运行的,但是有空格后一样直接输出NO,没有经过我们的确认,这是因为scanf在读取时候,遇到空格则会停止读取,而getchar一次只能读取一字符,即此时第一个getchar只读取一个空格,而第二个getchar读取了e,e不等于Y,则打印NO。
方法二:

#includeint main(){    char password[20] = { 0 };printf("请输入密码:>");scanf("%s", password);//123456int ch = 0;while ((ch = getchar()) != '\n'){;}    printf("请确认密码(Y/N):>");int ret = getchar();if ('Y' == ret){printf("Yes\n");}else{printf("No\n");}return 0;}

在这里插入图片描述
因为有了whlie循环,则getchar会一直读取直到读取到/n才停止读取,此时输入缓冲区没有可读取的字符,则第二个getchar会等待我们输入。

//代码2#include int main(){char ch = '\0';while ((ch = getchar()) != EOF){if (ch <0|| ch >9)continue;putchar(ch);}return 0;}//这个代码的作用是:只打印数字字符,跳过其他字符的、

2.for循环

for(表达式1; 表达式2; 表达式3)循环语句;表达式1表达式1为初始化部分,用于初始化循环变量的。表达式2表达式2为条件判断部分,用于判断循环时候终止。表达式3表达式3为调整部分,用于循环条件的调整。
//使用for循环 在屏幕上打印1-10的数字。#include int main(){int i = 0;//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)for (i = 1; i <= 10; i++)//{printf("%d ", i);}return 0;}

在这里插入图片描述
for循环流程图
在这里插入图片描述
即第一步先初始化变量,第二步判断变量是否符合循环条件,如果符合则执行循环语句,之后再执行循环调整部分,再开始下一次循环;如果不符合则结束循环。

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

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

2.1.for语句中的break和continue

我们发现在for循环中也可以出现break和continue,他们的意义和在while循环中是一样的。

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

在这里插入图片描述
当i=5,直接结束循环。和while循环中break一样。

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

在这里插入图片描述
可见for语句中的continue和while循环语句中continue一样都是都是跳过本次循环continue后面的语句,进行下一次循环的判断。

1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。//代码1#include int main(){    int i = 0;    for(i=1; i<=10; i++)      {   if(i == 5)   break;   printf("%d ",i);      }     return 0;}//代码2#include int main(){     int i = 0;     for(i=1; i<=10; i++)      {if(i == 5)   continue;printf("%d ",i);      }      return 0;}int i = 0;//前闭后开的写法for(i=0; i<10; i++){}//两边都是闭区间for(i=0; i<=9; i++){}

for循环中的一些变形

#include int main(){//代码1for (;;){printf("hehe\n");}//for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问题。//代码2int i = 0;     int j = 0;//这里打印多少个hehe?for (i = 0; i < 10; i++){for (j = 0; j < 10; j++){printf("hehe\n");}}//答案是100个hehe//代码3int i = 0;int j = 0;//如果省略掉初始化部分,这里打印多少个hehe?for (; i < 10; i++){for (; j < 10; j++){printf("hehe\n");}}//答案是10个hehe//代码4-使用多余一个变量控制循环int x, y;for (x = 0, y = 0; x < 2 && y < 5; ++x, y++){printf("hehe\n");}return 0;}
#includeint main(){int i = 0;int k = 0;for (i = 0, k = 0; k = 0; i++, k++)k++;return 0;}

答案是零循环
在这里插入图片描述
这是因为在判断部分中的k=0是假,即不循环。

3.do…while()循环

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

在这里插入图片描述
因为do…while循环语句循环至少执行一次,使用的场景有限,所以不是经常使用。

#include int main(){int i = 10;do{printf("%d\n", i);} while (i < 10);return 0;}

在这里插入图片描述

3.1.do while循环中的break和continue

do…while循环语句中的break和continue和前面两个循环语句中的break和continue用法一样。即

#include int main(){int i = 10;do{if (5 == i)break;printf("%d\n", i);} while (i < 10);return 0;}

友友们可以自己去尝试一下。

一些话

循环语句中break,continue用法都差不多,即break是永久结束循环,一次只能结束一个,continue结束当前循环,进行下一次循环的判断。while,for和do…while循环的结构等,都需要友友们去消化和掌握,记得要自己动手测试一下上面的代码,只有这样才能了解更加透彻。
不知不觉,又码完了一章,如果觉得对你有帮助的话,给个赞吧。感谢各位友友们的支持,我将会持续更新C语言,C++等语言的。感谢友友们的阅读,下一章见了。
在这里插入图片描述