3. 循环语句
3.1 while循环
3.1.1 语法结构
while(表达式) 循环语句;
while后的表达式结果为真
,那么就进入循环语句,循环语句执行后继续判断真假,然后往复,当表达式结果为假,那么就结束循环。
3.1.2 样例
实现打印1-10:
#include<stdio.h> int main() { int i = 1; while(i <= 10) { printf("%d ", i); i++;//自增条件 } return 0; }
运行结果:
注意这段代码i++
必不可少,由于表达式恒<=10,所以一直为真,那么就会一直循环,可不敢丢这个条件啊。
3.1.3 while循环的break和continue
1.break语句
#include<stdio.h> int main() { int i = 1; while (i <= 10) { if (5 == i) break; printf("%d ", i); i++; } return 0; }
在循环中只要遇到break
,就停止后期的所有的循环,直接终止循环
。
while中的break是用于永久终止循环的。
在这里当i = 5时,遇到了break循环就被终止了,因此只打印1 2 3 4
2.continue语句
#include<stdio.h> int main() { int i = 1; while (i <= 10) { if (5 == i) continue; printf("%d ", i); i++; } return 0; }
运行结果:
乍一看好像没什么问题,但是这个程序并没有结束,它陷入了死循环
,为什么?
continue适用于
终止本次循环
的,也就是continue后的代码不会被执行,直接跳转
到while语句的判断部分
,进行下一次循环的入口判断。
这里continue当i = 5时跳过本次循环,然后重新回到判断条件i<=10处,然后再跳出循环往复,形成了死循环。
3.2 for循环
我们自己观察不难发现while循环中具有着三个必须条件,就拿上段代码来说,int i = 1(初始化部分
),i<=10(判断部分
),i++(调整部分
),由于while循环的风格,三者偏离较远,调整代码时有一定的困难。
而for循环完美解决了这个缺点,for循环的条件相对集中,使用效率也比较高。
3.2.1 语法结构
for( 表达式1; 表达式2; 表达式3) 循环语句;
表达式1
表达式1为初始化部分,用于初始化循环变量的。
表达式2
表达式2为条件判断部分,用于判断循环什么时候终止。
表达式3
表达式3为调整部分,用于循环结构的调整。
3.2.2 样例
依然实现打印1-10:
#include<stdio.h> int main() { int i = 0; for(int i = 1; i <= 10; i++) { printf("%d ", i); } return 0; }
首先会执行i=1,然后判断条件是否成立,成立则进入循环体,再i++,再进行判断,再执行,在++,直到判断条件不成立,随后终止循环。
3.2.3 for循环的break和continue
1.break
#include<stdio.h> int main() { int i = 0; for(int i = 1; i <= 10; i++) { if(5 == i) break; //continue; printf("%d ", i); } }
运行结果:
和while循环中相同,当执行遇到break
时,会终止循环
。
2. continue
运行结果:
和while循环的continue的结果有所不同
,但原理还是相同的,continue
是终止本次循环
,那么continue后的语句就不执行了,由于这里的调整语句并不在continue下方,所以会直接i++在进行判断,只不过跳过了i = =5这个状况了。
3.2.4 对于for循环的一些建议
建议1
不可在for循环中修改循环变量,防止for循环失去控制
#include<stdio.h> int main() { int i = 0; for(int i = 1; i <= 10; ) { if(5 == i) continue; printf("%d ", i); i++; } }
例如随意改变调整部分的位置,从而导致原本能实现的功能没实现。
原本可以打印1 2 3 4 6 7 8 9 10的代码,被弄成了死循环
。
这不是自找麻烦吗?
for循环规定它是怎么样的,就按照规定写,不要另辟蹊径,以主流为准。
建议2
采用前闭后开的写法
#include<stdio.h> int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int i = 0; for (i = 0; i < 10; i++)//前闭后开 { printf("%d ", arr[i]); } }
相当于[ 0 , 10)
的写法,至于这样写的原因,是因为我们大多数时候用这种写法可以明确
地看出这个循环执行次数
,例如10 - 0,我们很明确的可以看出这个循环执行十次,但是对于其他情况下左闭右闭的方法会更为合适,就是看需求!
3.2.5 小试牛刀
下列程序循环次数为几次?
#include<stdio.h> int main() { int i = 0; int k = 0; for(i = 0, k = 0; k = 0; i++, k++) k++; return 0; }
条件判断部分:k = 0是一个赋值,每次都把k赋值为0,表达式结果为0,结果为假,循环次数为0次。
3.3 do…while()循环
3.3.1 语法结构
do…while循环由于其结构,至少会执行一次
。
也正因为其特性,所以应用场景较少。
do 循环语句; while(表达式);
3.3.2 样例
实现打印1-10:
#include<stdio.h> int main() { int i = 1; //1-10 do { printf("%d ",i); i++; }while(i<=10); return 0; }
3.3.3 do…while循环的break和continue
1.break
#include<stdio.h> int main() { int i = 1; //1-10 do { if(5 == i) break; //continue; printf("%d ",i); i++; }while(i<=10); return 0; }
break终止循环
,打印结果为1 2 3 4
2.continue
continue打印1 2 3 4,i此时等于5,continue
跳过本次循环
,i没有进行自增,而是直接跳转到条件判断部分,条件恒成立,于是死循环
。
3.4 一句话总结
循环语句各有优势,在使用循环时要再三思考,哪个比较契合题目,用最优的方法,得出最优的结果。
4. goto语句
goto语句是一个不常使用的语句。
goto运用不当可能会带来许多麻烦,但是合理的使用goto语句,可以达到预想不到的结果。
4.1 语法结构
goto语句也称为无条件转移语句
,其一般格式如下:
语句标号: goto 语句标号;
我们可以把语句标号
看作一个传送门
,每遇到语句标号就会跳转到相应的语句标号处,执行语句标号下的语句,遇到语句标号时继续跳转,循环往复…
4.2 样例
#include<stdio.h> int main { again: printf("hello anduin\n"); goto again; return 0; }
看这个例子,again就是所谓的语句标号,当程序运行时,首先打印,然后跳转到相应的语句标号,也就是在打印上方的again处,继续打印,这个程序就是来回打印"hello anduin"这句话,也可以看做一个死循环。
既然是循环,那么可以写成循环的形式,所以goto语句是可以用别的方式实现的。
4.3 goto语句的缺点
- goto语句可能会使代码
可读性降低
,毕竟传送门
可以随处存在 - goto
不能跨函数
使用。只能在本函数
内使用,应用范围小 - goto语句可以被
其他方式实现
,不可替代性低
4.3 goto语句的优点
大家可能觉得goto语句副作用这么多,它还有存在的必要嘛,要知道每个语句都是有它的优点的,goto语句也不例外。
goto语句在处理跳出多层嵌套循环时,具有着巨大的优势。
比如碰到一个多重嵌套的循环,我们在循环过后依然需要执行相关代码,不能退出函数,但是用break有需要用很多层,过程繁琐。
这时,使用goto语句,让这些问题都迎刃而解。
样例:
for(...) { for(...) { for(...) { if(disaster) break; } break; } break; } … if(disaster)
看如下情况,单单跳出循环就使用了3次break
,是不是过于繁琐了?
我们看看用goto
如何解决:
for(...) { for(...) { for(...) { if(disaster) goto error; } } } … error: if(disaster)
一个goto,问题迎刃而解,这就是它的优点。
4.4 小试牛刀
用goto语句写一个关机小程序(只要程序运行起来,电脑在一分钟内关机,如果输入我是猪取消关机,否则强制关机)
思路:我们知道在电脑中是可以通过指令对其进行关机的,如shutdown -s -t,-s用来设置关机,-t是用来设置关机的时间,而取消关机的指令为shutdown -a。
在C语言程序中,我们可以使用system()函数来执行系统命令,从而达到关机和取消关机的目的。
#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { char input[] = {0}; system("shutdown -s -t 60");//设置关机 again: printf("请注意,你的电脑将在一分钟内关机,输入我是猪,就取消关机\n"); scanf("%s", input); //判断 if(strcmp(input,"我是猪")==0) { system("shutdown -a");//取消关机 } else { goto again;//再给一次机会 } return 0; }
运行结果:
还等什么,快去和你的好朋友分享这段能增进友谊的代码吧!(bushi)。
4.5 一句话总结
每个语句都有自己的作用,用好goto语句,使它发挥属于自己的优势。
5. 结语
以上就是分支和循环语句的知识部分,后续我会基于对这部分内容的理解,对一些题目进行讲解。
如果觉得anduin写的还不错的话,还请一键三连哦!