在上一篇博客中,我们介绍了“分支与循环结构”中的顺序结构和选择结构。今天,我们将继续介绍其中剩余的循环结构。
C语言主要提供了三种主要的循环结构

while(判断表达式)// 如果为真,执行循环体,如果为假,跳出循环{ 循环体 }

首先判断表达式:若值为 0,循环直接结束;若值非 0,则执行循环体,执行完毕后再次判断表达式,依此循环往复。
例子:输入一个正整数,逆序打印出这个正整数的每⼀位。
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
while (n)
{
printf("%d", n % 10); // 获取最低位
n = n / 10; // 去掉最低位
}
return 0;
}
for(表达式1; 表达式2; 表达式3) { 循环体 }
表达式1:用于循环变量的初始化
表达式2:用于循环结束条件的判断
表达式3:用于循环变量的调整更新

首先执行表达式1初始化循环变量(此过程仅执行一次);随后执行表达式2进行判断:若结果为0,循环结束;若结果不为0,则执行循环语句,循环语句完成后,再去执行表达式3调整循环变量,然后再回到表达式2重新执行判断。此后便在表达式2、循环语句、表达式3之间循环执行,直至表达式2的判断结果为0时终止循环。
例子:计算1~100之间3的倍数的数字之和。
#include <stdio.h>
int main()
{
int sum = 0;
// 方法1:遍历所有数字,判断是否为3的倍数
for (int i = 1; i <= 100; i++) {
if (i % 3 == 0) {
sum += i;
}
}
// 方法2:直接生成3的倍数,更高效
for (int i = 3; i <= 100; i += 3) {
sum += i;
}
printf("%d\n", sum);
return 0;
}// for循环(初始化、判断、调整集中)
for (int i = 1; i <= 10; i++)
{
printf("%d ", i);
}
// while循环(初始化、判断、调整分散)
int i = 1; // 初始化
while (i <= 10)
{ // 判断
printf("%d ", i);
i++; // 调整
}for 循环和 while 循环在实现循环的过程中都有“”初始化、判断、调整“”这三个部分,但是 for 循环的三个部分都非常集中,比较便于代码的维护,而如果在代码比较多的时候, while 循环的三个部分会显得比较分散,所以从形式上 for 循环会显得更优一些 。
无论如何,先执行一次循环体,然后再判断循环是否应该继续下去。
do{ 循环体 }while(判断表达式);

do while循环的执行逻辑为:先执行循环体中的语句,执行完毕后再判断表达式。若表达式结果“不等于”0,循环继续;若结果“等于”0,循环终止。
这一机制决定了do while循环的核心特点——循环体至少会执行一次。
例子:打印1-10的数字.
#include <stdio.h>
int main()
{
int i = 1;
do {
printf("%d ", i);
i = i + 1;
} while (i <= 10);
return 0;
}1 2 3 4 5 6 7 8 9 10
循环之间可以互相嵌套(一个循环包含另一个循环),多用于实现一些复杂的逻辑。
for(初始化; 条件; 更新) { // 外层循环for(初始化; 条件; 更新) { // 内层循环 } }
例子:出100~200之间的素数。
#include<stdio.h>
int main()
{
int i = 0;
for (i = 100; i <= 200; i++)//用for循环产生100~200之间的整数
{
int n = 0;
int flag = 1;//假设i为素数
for (n = 2; n < i; n++)//n 为2~i-1之间不等于i的整数,只要这之间的数都不能整除i,则i为素数
{
if (i % n == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
printf("%d ", i);
}
}
return 0;
}立即强制跳出当前循环。
#include <stdio.h>
int main() {
// while循环中的break
int i = 1;
while (i <= 10) {
if (i == 5) {
break; // 终止循环
}
printf("%d ", i);
i++;
}
// 输出:1 2 3 4
// for循环中的break
for (int j = 1; j <= 10; j++) {
if (j == 5) {
break; // 终止循环
}
printf("%d ", j);
}
// 输出:1 2 3 4
return 0;
}跳过当前循环的剩余部分,直接开始下一次循环。
#include <stdio.h>
int main() {
// for循环中的continue
for (int i = 1; i <= 10; i++) {
if (i == 5) {
continue; // 跳过后续代码,直接i++
}
printf("%d ", i);
}
// 输出:1 2 3 4 6 7 8 9 10
// while循环中的continue
int j = 0;
while (j < 10) {
j++;
if (j == 5) {
continue; // 跳过后续代码,直接判断j<10
}
printf("%d ", j);
}
// 输出:1 2 3 4 6 7 8 9 10
return 0;
}跳转到程序中的指定标签位置。
#include <stdio.h>
int main() {
printf("开始\n");
goto label;
printf("这行不会执行\n");
label:
printf("跳转到这里\n");
return 0;
}goto语句若使用不当,会导致函数内部跳转混乱,扰乱程序执行流程,因此建议尽量避免使用;但不过它并非毫无价值,在我们多层循环场景中,用它来快速跳出循环会非常便捷。
#include <stdio.h>
int main() {
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
for (int k = 0; k < 10; k++) {
if (i * j * k == 120) {
goto found; // 直接跳出三层循环
}
}
}
}
printf("未找到\n");
return 0;
found:
printf("找到满足条件的值\n");
return 0;
}