4.1.1 while语句中的break和continue
break介绍:这个之前在switch语句中说过,作用是跳出switch语句。
在循环里也是一样的。
我们讲上面代码改造一下:
//break 代码实例 #include <stdio.h> int main() { int i = 1; while(i<=10) { if(i == 5) break; //这里如果i等于5,就会执行if下面的break语句 printf("%d ", i); i = i+1; } return 0; }
这段代码输出结果为:
1 2 3 4
在这里,我们没经过break之前,循环了4次,所以打印了四个数字,经过break语句之后跳出while循环语句。
总结:
break在while循环中的作用:
其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。
所以:while中的break是用于永久终止循环的。
continue介绍;这是一个新语句,循环语句专属的。
我们在来一段代码示例
//continue 代码实例1 #include <stdio.h> int main() { int i = 1; while(i<=10) { if(i == 5) continue;//如果i等于5,执行着这个语句 printf("%d ", i); i = i+1; } return 0; }
输出结果:
我们发现,程序一直在运行,没有结束,这是为什么呢?
因为continue的作用是,让本次循环continue后面的语句不执行,因为我们这个循环语句是小于等于10才会停止循环,而 i 这个变量的变化是在continue下面,所以 i 一直没有变,最终导致程序死循环。
我们再来看一段代码
//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; }
这段代码就不一样了,i 变量变化在continue的上面:
#include <stdio.h> int main() { int i = 1; while(i<=10) { i = i+1; if(i == 5) continue; printf("%d ", i); } return 0; }
输出结果:
2 3 4 6 7 8 9 10 11
总结:
continue在while循环中的作用就是:
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环的入口判断.
在这里我们介绍一段特殊的代码和特殊的函数
//代码什么意思? //代码1 #include <stdio.h> int main() { int ch = 0; while ((ch = getchar()) != EOF) putchar(ch); return 0; } 这里的代码适当的修改是可以用来清理缓冲区的. //代码2 #include <stdio.h> int main() { char ch = '\0'; while ((ch = getchar()) != EOF) { if (ch < ‘0’ || ch > ‘9’) continue; putchar(ch); } return 0; } //这个代码的作用是:只打印数字字符,跳过其他字符的。
getchar和putchar是什么呢?第一个是在键盘上读取一个字符,第二个是输出你刚才读取的字符,所以第一段代码运行是这样的:
代码二是除了0到9不触发continue。
我们无论是用scanf还是getchar,在输入字符的时候,都会有一个缓冲区,缓冲区里面是存放键盘上的字符的内存,我们在使用scanf和getchar时,它们回去缓冲区看是否有字符可以读取,比如说我们输入‘3’这个字符,注意这是字符,输入之后我们会按一下回车之后输出字符‘3’。
其实我们的缓冲区不仅仅有‘3’这个字符,还有你按回车之后留下的\n也就是换行,我们输入的时候如果不按回车它是不会到缓冲区里的。
getchar这个函数每次只能读取到一次字符。
至于EOF是什么,就是文件结束的标志,我们上面的代码有一个Z,然后就从循环跳出来了,这个是让我们getchar中的内容等于EOF,输入方法是,Ctrl加Z。
关于scanf这个函数,也是会去缓冲区读取,只不过读取是读取到空格就不读取了。
例子:
#include <stdio.h> int main() { int ch = 0; ch=getchar(); putchar(ch); return 0; }
输入输出:
QAQ
Q
#include <stdio.h> int main() { char ch[10] = {0}; scanf("%s", &ch); printf("%s", ch); return 0; }
输入输出:
asd asd
asd
4.2 for循环
我们已经知道了while循环,但是我们为什么还要一个for循环呢?
首先来看看for循环的语法:
4.2.1 语法
来看看这段代码
for(表达式1; 表达式2; 表达式3) 循环语句;
表达式1
表达式1为初始化部分,用于初始化循环变量的。
表达式2
表达式2为条件判断部分,用于判断循环时候终止。
表达式3
表达式3为调整部分,用于循环条件的调整。
举个例子:
使用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; }
运行代码我结果是:
1 2 3 4 5 6 7 8 9 10
for循环的执行流程图:
现在我们对比一下for循环和while循环。
int i = 0; //实现相同的功能,使用while i=1;//初始化部分 while(i<=10)//判断部分 { printf("hehe\n"); i = i+1;//调整部分 } //实现相同的功能,使用for for(i=1; i<=10; i++) { printf("hehe\n"); }
输入输出都是一样的:
hehe
可以发现在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹;for循环使用的频率也最高。
4.2.2 break和continue在for循环中
我们发现在for循环中也可以出现break和continue,他们的意义和在while循环中是一样的。
但是还是有些差异:
//代码1 #include <stdio.h> int main() { int i = 0; for(i=1; i<=10; i++) { if(i == 5) break; printf("%d ",i); } return 0; } //代码2 #include <stdio.h> int main() { int i = 0; for(i=1; i<=10; i++) { if(i == 5) continue; printf("%d ",i); } return 0; }
代码1的输出结果是:
1 2 3 4
代码2的输出结果是:
1 2 3 4 6 7 8 9 10
先看第一段代码,我们变量 i 等于5的时候,就进入if 语句执行break跳出for循环。
第二段代码,continue在while循环时候是需要注意条件存放的位置,而for循环就不用。
4.2.3 for语句的循环控制变量
建议:
- 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
- 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
//代码1 #include <stdio.h> int main() { int i = 0; for(i=1; i<=10; i++) { i=5; printf("%d ",i); } return 0; }
代码1打印结果是:
1 2 3 4 5 5 5 5 5 5 5 …
最后5死循环了。
//代码2 int i = 0; //前闭后开的写法 for(i=0; i<10; i++) {} //两边都是闭区间 for(i=0; i<=9; i++) {}
其实两个都一样,只不过第一个更容易理解,看到判断条件就知道,循环10次。第二个你需要想一下才能知道。
不过有些情况第二种更好,以后我的例子可能会有,这里就不举例子了。
4.2.4 一些for循环的变种
for也可以有不同的写法,语法也是支持的
#include <stdio.h> 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"); } } //代码3 int i = 0; int j = 0; //如果省略掉初始化部分,这里打印多少个hehe? for(; i<10; i++) { for(; j<10; j++) { printf("hehe\n"); } } //代码4-使用多余一个变量控制循环 int x, y; for (x = 0, y = 0; x<2 && y<5; ++x, y++) { printf("hehe\n"); } return 0; }
让我们逐个分析:
代码1:三个表达式一个都没有,也就是说,没有能使循环开始和停止的条件,所以默认为进入和不终止循环。如此,代码1死循环。
代码2:这里打印了100个hehe,for进行嵌套,进入第一个for循环中之后,执行里面的for,里面的for又进行循环。
代码3:这段代码我们只打印了10个hehe,为什么呢?因为刚开始初始化变量 i 和 j 的值为0,我们第一次进入第二个for循环的时候,变量 j 还是从0开始的,但是这一次的循环让变量 j 变成了10。所以第二次进入第二个for循环时变量 j 等于10,判断条件不成立,所以不会进入第二个for循环语句。
代码4:这段代码的判断条件是x<2并且y<5,,也就是说只有两个条件同时成立才会进行,代码的输出是2个hehe,因为x到2的时候已经不符合x<2了。
4.3 do…while()循环
4.3.1 do语句的语法
do 循环语句; while(表达式);
4.3.2 执行流程
4.3.3 do语句的特点
循环至少执行一次,使用的场景有限,所以不是经常使用。
#include <stdio.h> int main() { int i = 0; do { printf("%d\n", i); i++; }while(i<10); return 0; }
这里我们输出的是:
0 1 2 3 4 5 6 7 8 9 10 11
等到11被打印出了之后,才停止,这就是do while循环。上来二话不说先进入,后判断。
4.3.4 do while循环中的break和continue
当然这个循环也有break和continue。
这两个的作用和以前都一样。
//代码1 #include <stdio.h> int main() { int i = 0; do { i++; if(5 == i) break; printf("%d\n", i); }while(i<10); return 0; } //代码2 #include <stdio.h> int main() { int i = 0; do { i++; if(5 == i) continue; printf("%d\n", i); }while(i<10); return 0; }
代码1的运行结果是:
1
2
3
4
代码2的运行结果:
1
2
3
4
6
7
8
9
10
5. goto语句
C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。
从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。
但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过
程。
例如:一次跳出两层或多层循环。
多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。
goto语言真正适合的场景如下:
for(...) for(...) { for(...) { if(disaster) goto error; } } … error: if(disaster) // 处理错误情况
这里运行到goto语句就会跳到error:那里,然后进入if(disaster)语句进行判断。
6. 给家人们的留言!
这里C语言的分支与循环语句的就讲完了,当然只是知识点和一些例子是不够的,我之后还会出一期分支与循环的练习,我们将会完成一些有趣的代码,比如猜数字游戏,代码关机等等。
那么家人们,如果觉得文章写的不错就请点个赞,关注一波,如果有错误请指点,谢谢!