三、循环
在c语言中,循环共有三种,while循环,for循环,do while循环。在之前我们粗略的了解了while循环,现在我们来详细了解这三种循环。
1.while循环
(1)基本原理与用法
我们在上一篇文章中已经了解了if语句的使用,我们这里复习一个简单的if语句。
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int main() { int num = 0; if (num == 0) printf("hehe"); return 0; }
这段代码的意思很简单,只要if里面条件成立,则打印hehe。其实while循环和if语句是非常相似的。我们这里在上面的代码稍作修改,将if改为while会发生什么呢?
#include<stdio.h> int main() { int num = 0; while (num == 0) printf("hehe"); return 0; }
输出结果为一个无限打印hehe。对于while语句
一般是这样的形式
while(判断语句)
循环体;
只有当判断语句为真的时候,可以执行下面的语句。执行完以后重新判断,如果仍为真,继续判断,直到为假才能跳出循环。当然上面这种情况下,循环体只能是一条语句,如果想要是多条语句则需要加上大括号
while(判断语句)
{
循环体;
}
这样的话就是多条语句的循环,不难看出,和if语句是很相似的。
我们来实现一个简单的题目,打印出1---10的数字
#include<stdio.h> int main() { int i = 1; while (i <= 10) { printf("%d ",i); i++; } return 0; }
(2)break在while循环中的作用
我们看这样一段代码
#include<stdio.h> int main() { int i = 1; while (i <= 10) { if (5 == i) { break; } printf("%d ", i); i++; } return 0; }
这段代码的运行结果是1 2 3 4
也就是说,我们可以调试一下分析该代码,我们会发现当i等于5时,满足if的条件,执行了break,然后下一步我们的代码就跳出了while循环。程序就结束了。
也就是说break的作用是打破循环
结论:break在while循环中的作用:
在while循环中遇到break,就会停止后期所有的循环,直接终止循环
所以,while中的break是用于永久终止循环的
(3)continue在while循环中的作用
我们先看一段代码,并思考一下运行结果是什么
#include<stdio.h> int main() { int i = 1; while (i <= 10) { if (5 == i) { continue; } printf("%d ", i); i++; } return 0; }
运行结果为,1234然后死循环但是不打印任何东西。
我们在给出一段代码。看看这个运行结果是什么
#include<stdio.h> int main() { int i = 1; while (i <= 10) { i++; if (5 == i) { continue; } printf("%d ", i); } return 0; }
运行结果为
现在已经不是死循环了,可以打印出来值,并且使得循环结束。
那么continue的作用到底是什么呢?我们给出结论
continue在while循环中的作用:
continue是用于终止本次循环的,也就是本次循环中continue后面的代码都不会被再次执行
而是直接跳转到while语句的判断部分,进行下一次的循环入口判断。
(4)一图总结while循环
2.for循环
(1)基本语法
#include<stdio.h> int main() { for (表达式1; 表达式2; 表达式3) { 表达式4; } return 0; }
如图所示,for循环先执行表达式1,然后表达式2为判断,如果成立,则执行表达式4,然后执行表达式3,在进行表达式2判断,如此循环下去。
其中
表达式1
表达式1为初始化部分,用于初始化循环变量的。
表达式2
表达式2为条件判断部分,用于判断循环时候终止。
表达式3
表达式3为调整部分,用于循环条件的调整。
我们举一个简单的例子,打印1--10之间的数字
#include<stdio.h> int main() { int i = 0; for (i = 0; i <= 10; i++) { printf("%d ", i); } return 0; }
(2)break在for循环中的作用
我们来看这样一段代码
#include<stdio.h> int main() { int i = 0; for (i = 1; i <= 10; i++) { if (i == 5) { break; } printf("%d ", i); } return 0; }
运行结果为1 2 3 4
可见,break在for循环中的作用与while循环一样
(3)continue在for循环的作用
#include<stdio.h> int main() { int i = 0; for (i = 1; i <= 10; i++) { if (i == 5) { continue; } printf("%d ", i); } return 0; }
运行结果为
我们发现于while循环中有一定差异,因为while循环中不执行调整语句,而for循环执行调整语句,可见存在稍微的差异,导致结果不同,但是其实仍然具有一定的统一性,因为都是只跳过了本次循环的大括号里面的语句,while循环中,调整语句就在大括号里面,所以跳过,而for循环调整语句不在大括号里面,所以不跳过调整语句。
(4)for循环几个建议
①不可在for循环体内修改循环变量,防止for循环失去控制。
②建议for语句的循环控制变量的取值采用“前闭后开区间”写法
(5)变种的for循环
①下面代码中,for循环可以省略初始化部分,判断部分,调整部分,如果省略了判断部分,则判断恒为真。为死循环。
#include <stdio.h> int main() { for (;;) { printf("hehe\n"); } return 0; }
②这条语句总共打印9个hehe,因为是两个for循环的嵌套使用
#include<stdio.h> int main() { int i = 0; int j = 0; //这里打印多少个hehe? for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { printf("hehe\n"); } } }
③这段代码省略了初始化部分,只打印3个hehe,因为j不会被再次初始化
#include<stdio.h> int main() { int i = 0; int j = 0; //如果省略掉初始化部分,这里打印多少个hehe? for (; i < 3; i++) { for (; j < 3; j++) { printf("hehe\n"); } } }
④使用了多余一个变量来控制循环,如下所示,结果为两个hehe
#include<stdio.h> int main() { //使用多余一个变量控制循环 int x, y; for (x = 0, y = 0; x < 2 && y < 5; ++x, y++) { printf("hehe\n"); } return 0; }
(6)一道经典的错误标准的零分
#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,为假,因为只有0为假,非零都为真。所以,这道题什么都不打印。
3.do while循环
(1)do while语句的语法
#include<stdio.h>
int main()
{
do
{
//代码块
} while();
return 0;
}
在do while语句中,无论条件是否成立,代码是先执行一次,然后在进行判断的,如果为真,则进入循环。值得注意的是,do while的判断语句后面有一个分号,这点于while和for循环不太一样。
我们仍然举一个简单的例子,打印1---10
#include<stdio.h> int main() { int i = 1; do { printf("%d ", i); i++; } while (i <= 10); return 0; }
(2)break在do while循环中的作用
我们看这样一段代码
#include<stdio.h> int main() { int i = 1; do { printf("%d ", i); if (i == 5) { break; } i++; } while (i <= 10); return 0; }
输出结果为
可见,break的作用为打破循环。与在while和for循环中的作用一样
(3)continue在do while循环中的作用
我们看这样一段代码
#include<stdio.h> int main() { int i = 1; do { printf("%d ", i); if (i == 5) { continue; } i++; } while (i <= 10); return 0; }
输出结果为12345555555555555
可见continue的作用仍为,结束本轮循环,也就是跳过本次循环的大括号内剩余的内容。重新进入判断。
4.一些经典的题目
为了使文章条理更加清晰一些,我们将这一部分放在了另外一篇博客中,读者可以通过该链接进行跳转经典题目详解
5.猜数字游戏
为了使得文章条理清晰,我们将该部分放在了另外一篇博客中,这是链接 猜数字游戏
6.goto语句
C语言中提供了可以随意滥用的goto语句和标记跳转的标号。
从理论上goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。
但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。
例如:一次跳出两层或多层循环。
多层循环这种情况使用break是达不到目的。它只能从最内层循环退出到上一层的循环。
如下代码所示,是一个简单的goto使用
#include<stdio.h> int main() { flag: printf("haha"); goto flag; return; }
我们在举一个例子,是goto语句在关机程序中的使用
一个关机程序
程序执行起来就倒计时关机,60秒后关机
如果输入:我是猪,就取消关机
#include<stdio.h> #include<windows.h> int main() { char input[20] = { 0 }; system("shutdown -s -t 60"); again: printf("你的电脑将在60s后关机,如果输入我是猪,就取消关机"); scanf("%s", input); if (0 == strcmp(input, "我是猪")) { system("shutdown -a"); } else { goto again; } }
这就是我们的代码,当我们输入我是猪时候,就会停止关机
其中有几个库函数和命令需要大家了解一下
showdown -s -t 60的意思是60秒后关机
showdown -a的意思是取消关机
当然还有很多命令我们这里附上一个链接,希望大家可以去这里面都自己学习一下这个命令。
总结
本节主要讲述了,三大循环,以及goto循环的一些应用。如果对你有帮助的话,不要忘记点赞加关注哦。