循环语句:
一般的循环语句分为以下三种:
- while
- for
- do while
while循环
首先我们来介绍下while的语法结构 while(表达式) 循环语句; 当表达式为真,则执行下面的语句;语句执行完之后再判断表达式是否为真,如果为真,再次执行下面的语句;然后再判断表达式是否为真……就这样一直循环下去,直到表达式为假,跳出循环。这个就是 while 的执行顺序。 注意,初学者编程时,if、else、for、while、do 后面的执行语句不论有多少行,就算只有一行也要加“{}”,养成良好的编程习惯尤为重要。
下面来看一段代码有助于理解:现在我们需要打印1-10这十个数字,该怎么实现呢?
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> //打印1-10这十个数字,用while循环 int main(){ int i = 1; while (i <= 10) { printf("%d\n",i); i++; } return 0; }
上面代码便是用while循环来实现打印1-10这十个数字,相信看完此段代码大家对于while循环会有一个初步的理解。
while语句中的break
其实只要在循环中遇到break,就停止后期的所有循环,直接终止所有循环,所以while中的break是用于永久终止循环的 注意:while循环中0break语句除了会出现在switch语句,剩余的都要出现在while循环语句中。
下面来看一段代码,思考这里代码的输出结果是什么?
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main(){ int i = 1; while (i <= 10) { if (i == 5) break;//遇到break,直接结束所有循环 printf("%d ", i); i = i + 1; } return 0; }
最终会输出 1,2,3,4。原因是此时i=1,小于10为真,则进入到while循环中,首先i=1并不等于5,则此时打印i=1,i++后为2;i=2小于10为真,但i不等于5,则此时输出i=2,i++后为3,小于10为真,则继续执行if条件语句,i=3不等于5,则继续输出3,i++后为4,4小于10为真,但不等于5,则此时输出4后,i++为5,5此时为真,则执行break语句,但不输出5,则最终的输出结果为1,2,3,4.
while语句中的continue
在while循环中,continue是用来终止本趟循环的,也就是本次循环中continue后的代码不会再执行,而是直接跳转到while语句的判断部分,进行下一次循环的入口判断。
下面来看一段代码,思考此段代码的输出结果是什么?
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> //遇到continue,直接结束本趟循环 int main(){ int i = 1; while (i <= 10) { if (i == 5) continue;/*遇到continue,直接结束本趟循环,此时当i累加到5时判断为真,执行 continue语句,此时会结束本趟循环然后返回到while语句,我们会发现形成了一个死循环, 即又执行了一遍if判断语句,i等于5后又执行一遍continue语句后返回while语句*/ printf("%d ", i); i = i + 1; } return 0; }
分析:此时i=1,小于10为真,则进入到while循环中,首先i=1并不等于5,则此时打印i=1,i++后为2;i=2小于10为真,但i不等于5,则此时输出i=2,i++后为3,小于10为真,则继续执行if条件语句,i=3不等于5,则继续输出3,i++后为4,4小于10为真,但不等于5,则此时输出4后,i++为5,5此时为真,则执行continue语句,返回while判断语句,此时5小于10,为真,则继续执行if判断语句,i=5为真,则执行continue语句,此时继续返回到while判断语句,我们会发现此时陷入了死循环,即永远都在判断i是否为5,则进行输出时会一直停留在5的位置。
输出结果为:
如果将上述代码修改下,此时输出结果又是多少呢?下面来看一段代码:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> //遇到continue,直接结束本趟循环 int main(){ int i = 1; while (i <= 10) { i = i + 1; if (i == 5) continue; printf("%d ", i); } return 0; }
此时i=1,小于10为真,则进入到while循环中,首先i=1并不等于5,则此时打印i=1,i++后为2;i=2小于10为真,但i不等于5,则此时输出i=2,i++后为3,小于10为真,则继续执行if条件语句,i=3不等于5,则继续输出3,i++后为4,4小于10为真,但不等于5,则此时输出4后,i++为5,5此时为真,则执行continue语句,返回while判断语句,此时5小于10,为真,则继续执行if判断语句,i=5为真,则执行continue语句,此时继续返回到while判断语句,我们会发现此时陷入了死循环,即永远都在判断i是否为5,则进行输出时会一直停留在5的位置。
输出结果为:
下面再来看两段代码,并进行分析
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main(){ int ch = 0; while ((ch = getchar()) != EOF) { putchar(ch); } return 0; }
当上面的程序运行时,如果不加" != EOF",那么这个程序就是个死循环,会一直运行下去;加上" != EOF"后该程序就不是死循环了,ch=getchar()的意思是从键盘读入一个字符,而输入的内容被放入了缓冲区中,EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~127,不可能出现-1,因此可以用EOF作为文件结束标志。如果在终端不进行输入该程序会自动结束(while的意思就是说当前输入缓存还有东西时就一直读取,直到输入缓存中的内容为空时停止)。 有小伙伴会问到上面那个程序怎么结束呢? 要注意的是:在终端(黑框)中手动输入时,系统并不知道什么时候到达了所谓的“文件末尾”,因此需要用组合键然后按 Enter 键的方式来告诉系统已经到了EOF,这样系统才会结束while,下面来看输出结果:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main(){ int ch = 0; while ((ch=getchar())!=EOF) { if (ch >= '0'&&ch <= '9') { putchar(ch); } } return 0; }
在文本文件中,数据都是以字符的ASCII代码值的形式存放,那么此时字符‘0’与字符‘9’在ASCII代码值中所对应的值分别为49与57,如图所示,那么此时若在终端(黑框)中输入超过此数字范围的数字时,便不会进行输出,那么我们此时运行下此段代码并进行输出看下结果吧。
此时我们在框中输入1234ddd时我们会发现最终只输出了1234,原因是小写字母d在ASCII表中所对应的值为100,已经超过了57,所以并不会进行输出。 当我们此时继续输入大写FGH时此时仍然不会进行输出,原因是大写字母从A开始所对应的ASCII值为65,仍然大于57,而FGH分别为70,71,72,更不会进行输出了。下面来看运行结果:
此处附上ASCII码表的链接:http://www.asciima.com/
for循环
我们已经知道了 while 循环,但是我们为什么还要一个 for 循环呢? 首先来看看 for 循环的语法:
for(表达式1;表达式2;表达式3) 循环语句; 表达式 1 表达式 1 为 初始化部分 ,用于初始化循环变量的。 表达式 2 表达式 2 为 条件判断部分 ,用于判断 循环时候终止。 表达式 3 表达式 3 为 调整部分 ,用于循环条件的调整。 实际问题: 注意:for循环的执行顺序为表达式1->表达式2->循环语句->表达式3->表达式2->循环语句->表达式3->表达式2->循环语句->表达式3如此往下循环下去。 表达式1可以不写,但是如果表达式2不写的话,便会陷入死循环。
下面用for循环打印1-10这十个数字
#define _CRT_SECURE_NO_WARNINGS 1 #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; }
输出结果为:
下面再来跟while语句的是实现做下对比吧:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> //打印1-10这十个数字,用while循环 int main86(){ int i = 1; while (i <= 10) { printf("%d\n",i); i++; } return 0; }
从中我们可以看出在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹。 for循环使用的频率也最高。
for语句的循环控制变量
下面给出一些建议: 1. 不可在 for 循环体内修改循环变量,防止 for 循环失去控制。 2. 建议 for 语句的循环控制变量的取值采用 “ 前闭后开区间 ” 写法。 int i=0; //前闭后开的写法 for(i=0;i<10;i++) {} //两边都是闭区间的写法 for(i=0;i<=10;i++) {
continue在for循环中
continue循环在for语句中的作用与while循环的作用是一样的,在这里不过多的进行介绍,
下面来看一段代码,并给出其运行结果:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main(){ int i = 0; for (i = 1; i <= 10; i++)/*此处for循环中第二个表达式为条件判断语句,即i=0这个表达式, 在c语言中0为假,1为真,此时i=0为假,则循环终止,此时不输出任何值*/ { if (i == 5) continue; printf("%d\n",i); } return 0; }
输出结果为:
break在for循环中
break语句在for语句中的作用与在while循环中的作用是一样的,前面已经做了详细的介绍,下面我们直接来看一段代码,并思考他的运行结果:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main(){ int i = 0; for (i = 1; i <= 10; i++)/*此处for循环中第二个表达式为条件判断语句,即i=0这个表达式, 在c语言中0为假,1为真,此时i=0为假,则循环终止,此时不输出任何值*/ { if (i == 5) break; printf("%d\n", i); } return 0; }
输出结果为:
下面来看一些for循环的变种:思考下列代码并给出其输出结果
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { //变种1 for (;;) { printf("hehe\n");//会成死循环 } //变种2 int x, y; for (x = 0, y = 0; x<2 && y<5; ++x, y++) { printf("hehe\n");//会输出两次hehe } return 0; }
第一个for循环会变成死循环,第二个for循环会打印两次hehe.
下面再来看一个面试题:并给出此段代码的输出结果:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main(){ int i = 0; int k = 0; for (i = 0, k = 0; k = 0; i++, k++)//此时没有输出结果,原因是此时k=0,判断为假,不执行循环内部的break语句 k++; return 0; }
此段代码不会输出任何结果,原因是此时判断条件k=0,为假,所以此时并不会去执行循环体内部的语句。
do while循环
do{ 语句块 }while(表达式); 注意:do-while循环与while循环的不同在于:它会先执行“语句块”,然后再判断表达式是否为真,如果为真则继续循环;如果为假,则终止循环。因此,do-while 循环至少要执行一次“语句块”。
下面我们用do while循环实现打印1到10这10个数字:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main(){ int i = 1; do { printf("%d\n",i); i++; } while (i <= 10); return 0; }
输出结果为:
do while循环中的break
do while循环中的break语句的作用跟之前相同,在这里我们直接上代码,并思考其输出结果:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main(){ int i = 2; do { if (i == 5) break; i++; printf("%d\n",i); } while (i < 10); return 0; }
此段代码的输出结果为3,4,5。
do while循环中的continue
do while循环中的continue语句的作用与之前相同,这里我们直接上代码,并给出其输出结果:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main(){ int i = 2; do { if (i == 5) continue; i++; printf("%d\n",i); } while (i < 10); return 0; }
此处的输出结果为3,4,5并且会一直在5处停顿,因为此时陷入了死循环。