三、循环语句
1.while循环
1.1 while的语法结构
//while的语法结构
while(表达式)
循环语句;
表达式为真时进入循环,直到表达式为假就退出循环。
比如:我们实现在屏幕上打印1~10的数字
#include<stdio.h> int main() { int a = 1; while (a <= 10) { printf("%d ", a); a++; } return 0; }
每次循环打印出a的值,然后a自增1,直到a大于10,退出循环。
1.2 while循环中的break和continue的作用
break:终止整个循环
continue:跳过本次循环中continue后面的代码,继续执行以后的循环直到结束
下面用代码来对比一下break和continue在while循环中的作用:
break:
#include<stdio.h> int main() { int a = 1; while (a <= 10) { if (a == 5) break;//终止整个循环 printf("%d ", a); a++; } return 0; }
代码运行结果:
当a=5时,执行break,跳出了整个循环,所以数字5及以后得数字都没有打印出来。
continue:
#include<stdio.h> int main() { int a = 1; while (a <= 10) { if (a == 5) continue;//结束本次循环,继续执行后面的循环直到结束 printf("%d ", a); a++; } return 0;
代码运行结果:
代码执行完毕后,打印部分光标一直在闪烁,说明代码陷入了死循环,一直在执行。原因是:当a=5时执行continue,跳过continue后面的代码直接来到循环判断条件,此时因为a不再自增,a始终等于5,满足循环条件,所以陷入死循环。
通过以上的代码对比可以得出:break:终止整个循环。continue:跳过本次循环中continue后面的代码,继续执行以后的循环直到结束。
2.for循环
2.1为什么要学for循环?
前面已经学了while循环,有人就有疑惑了,我直接用while循环写不就行了?为什么还要用for循环呢?下面我们看一段代码:
#include<stdio.h> int main() { int a = 1;//初始化 while (a <= 10)//判断 { printf("%d ", a); a++;//调整 } return 0; }
实际上,whlie循环有初始化、判断、调整三个步骤,并且三个步骤是分离的,其中任意一个步骤出错就会导致整个代码出现错误,后期改代码比较困难。而for循环就有效的解决了这个问题,下面我们来看for循环。
2.2 for循环的语法结构
for(表达式1;表达式2;表达式3)
循环语句;
表达式1:初始化部分,用来初始化循环变量。
表达式2:条件判断部分,用来判断循环什么时候终止。
表达式3:调整部分,用于循环条件的调整。
将上述打印1~10的代码用for循环写出来:
#include<stdio.h> int main() { int a = 0; for (a = 1; a <= 10; a++) { printf("%d ", a); } return 0; }
for循环将初始化、判断、调整三步骤写在一起,这样在我们后期发现错误时也便于改正。
2.3 for循环中break和continue的作用
break 和 continue 在 fo r循环中和在 while 循环中的意义是一样的,但是还是有些差异:
依旧是打印1~10的代码:
break:
#include<stdio.h> int main() { int a = 0; for (a = 1; a <= 10; a++) { if (5 == a) break; printf("%d ", a); } return 0; }
运行结果:
由此可见,break在for循环中的作用与在while循环中的作用一样,都是跳出整个循环。
continue:
#include<stdio.h> int main() { int a = 0; for (a = 1; a <= 10; a++) { if (5 == a) continue; printf("%d ", a); } return 0; }
运行结果:
这次打印出10以内除了5以外的数,可见continue的作用依旧是跳出本次循环中continue后面的代码,执行以后的循环直到结束。不同的是在for循环中continue会跳到循环调整的部分(a++)继续执行,而在while循环中,continue会直接跳过调整部分,跳到循环判断部分(a<=10),所以for循环中可以打印出6 7 8 9 10,而在while循环中只能是陷入死循环。
2.4 for 语句的循环控制变量
建议:
1.不可在for循环体内修改循环变量,防止for循环失去控制。
2.建议for语句的循环控制变量的取值采用“前闭后开区间”的写法。
int i=0; //前闭后开区间的写法 for(i = 0; i < 10; i++) {} //两边都是闭区间 for(i = 0; i <= 9; i++) {}
2.5一些for循环的变种
#include<stdio.h> int main() { //代码1 for (; ;) { printf("hehe\n"); } //for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问题。 //代码2 int i = 0; int j = 0; for (i = 0; i < 10; i++) { for (j = 0; j < 10; j++) { printf("hehe\n"); } }//这里应该会打印出100个hehe。 //代码3 int i = 0; int j = 0; for (; i < 10; i++) { for (; j < 10; j++) { printf("hehe\n"); } }//这里应该会打印出10个hehe }
为什么代码3只会打印出来10个hehe呢?
因为省略了初始化,默认进来时 i 和 j 都等于0,当 i = 0时,j = 0~9,循环10次,打印10个hehe,最后一次循环结束后 j = 10,而当 i = 1~9时,由于省略了初始化,j依旧等于10,这时内层循环就执行不了了,所以只在 i = 0时打印了10个hehe。
3. do while 循环
3.1 do while 循环的语法结构
do
循环语句;
while(表达式);
注意:do while 循环至少会循环一次,因为它的循环判断条件在循环语句的后面。
用 do while循环打印出1~10:
#include<stdio.h> int main() { int i = 1; do { printf("%d ", i); i++; } while (i <= 10); return 0; }
执行时,先打印 i 并且 i 自增,然后再进行判断。
3.2 do while 循环中break和continue的作用
其实与前面的在while循环和for循环中的作用一样,大家可以运行下面代码自己试一下:
break:
#include<stdio.h> int main() { int i = 1; do { if (5 == i) break; printf("%d ", i); i++; } while (i <= 10); return 0; }
continue:
#include<stdio.h> int main() { int i = 1; do { if (5 == i) continue; printf("%d ", i); i++; } while (i <= 10); return 0; }
4. goto 语句
C语言中提供了可以随意滥用的 goto 语句和标记跳转的标号。
从理论上来说 goto 语句是没有必要的,实践中没有 goto 语句也可以很容易的写出代码
比如:
#include<stdio.h> int main() { int a = 0; n://标签 printf("%d ", a); goto n;//跳转到标签 return 0; }
运行结果:
上述代码中的 n 是标签,是goto语句跳转到的地方,一直跳转就形成死循环
那为什么说goto语句没有必要呢?
因为上述代码我们完全可以用while循环来实现。(代码如下)
#include<stdio.h> int main() { int a = 0; while (1) { printf("%d ", a); } return 0; }
但是在某些场合下 goto 语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。
例如:一次跳出两层或多层循环。
一次跳出多层循环使用 break 是达不到目的的,它只能从最内层循环退出到上一层循环。
但goto语句可以,它适用的场景如下:
for (...) { for (...) { for (...) { if (disaster) goto error; } } } error://处理错误情况。
它可以直接从最内层的循环中跳出去。
一段关机程序
下面我们可以来写一段关机程序:(请仔细看完代码后谨慎使用,避免不必要的麻烦)
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h> #include<stdlib.h> int main() { char arr[20] = { 0 }; printf("请注意,你的电脑将在1分钟之内关机,如果输入:我是猪,则取消关机\n"); system("shutdown -s -t 60"); again: scanf("%s", arr); if (strcmp(arr, "我是猪") == 0) { system("shutdown -a"); printf("取消关机\n"); } else { printf("输入错误,请重新输入\n"); } goto again; return 0; }
代码中,shutdown -s -t 60和shutdown -a分别是定时关机和取消关机的命令,system是一个函数用来执行系统命令,它的库函数是stdlib.h,strcmp是用于字符串的比较,如果比较相等时,返回0,它的库函数是string.h。