循环语句这些知识点你真的会了吗?(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
一些话
前言
控制语句有分支语句和循环语句,其中循环语句分为while循环语句,for循环语句和do while循环语句,其中for语句用到最多的循环语句。
1.while循环
语法结构:
while(表达式) 循环语句;
例如:在屏幕上打印1-10的数字。
#include int main() { int i = 1;//初始化变量i while (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;//初始化变量i while (i <= 10)//判断变量i的值 { if (i == 5)//判断变量i的值是否等于5,如果不等于则if语句为假,不执行break,如果为真,则执行break break; 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前面,结果会发生变化
#include int 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后面的代码,直接进行下一次循环的判断。
#include int main() { int ch = 0; ch = getchar();//获取一个字符,并用该字符的ASCII码值放到ch中 printf("%c\n", ch); putchar(ch);//打印字符 return 0; }
int getchar( void );//getchar()类型是int
读取错误或文件结束条件,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);输出此字符,
即
#include int main() { int ch = 0; while ((ch = getchar()) != EOF)//判断读到的字符是不是EOF,不是则循环,不是则结束循环 putchar(ch); return 0; }
按Crtl+z即可停止读取
//举一个例子 //假设密码是一个字符串 #include int main() { char password[20] = { 0 }; printf("请输入密码:>"); scanf("%s", password);//123456 printf("请确认密码(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。那么我们可以通过两种办法来改良。
方法一:
#include int main() { char password[20] = { 0 }; printf("请输入密码:>"); scanf("%s", password);//123456 getchar();//读取了\n int 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。
方法二:
#include int main() { char password[20] = { 0 }; printf("请输入密码:>"); scanf("%s", password);//123456 int 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 ‘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; //实现相同的功能,使用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.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() { //代码1 for (;;) { printf("hehe\n"); } //for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问 题。 //代码2 int i = 0; int j = 0; //这里打印多少个hehe? for (i = 0; i < 10; i++) { for (j = 0; j < 10; j++) { printf("hehe\n"); } }//答案是100个hehe //代码3 int 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; }
#include int 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++等语言的。感谢友友们的阅读,下一章见了。