引言:为什么需要循环?
在编程中,我们经常会遇到需要重复执行某些操作的情况。比如:计算1到100的和、批量处理数据、重复验证用户输入等。如果每步都手动编写,代码会变得冗长且难以维护。这时,循环结构就像我们的“得力助手”,能让代码变得简洁高效!
一、for循环:最常用的循环结构
1.1 for循环的基本形式
for(表达式1; 表达式2; 表达式3)
{
语句块; // 需要重复执行的代码
}
三个表达式的含义:
-
表达式1:初始化表达式,在循环开始前执行一次,通常用于设置循环变量的初始值
-
表达式2:条件表达式,每次循环前检查,为真则执行循环体,为假则退出循环
-
表达式3:迭代表达式,每次循环结束后执行,通常用于更新循环变量
1.2 基础示例:打印数字1-5
#include <stdio.h>
int main()
{
int Num = 0;
int i = 0;
// 循环5次,i从1递增到5
for(i = 1; i < 6; i++)
{
Num = i;
printf("Num = %d\\n", Num);
}
return 0;
}
执行过程解析:
i=1 → 满足i<6 → 执行循环体 → i++变成2
i=2 → 满足i<6 → 执行循环体 → i++变成3 …
i=5 → 满足i<6 → 执行循环体 → i++变成6
i=6 → 不满足i<6 → 循环结束
1.3 实战练习:鸡兔同笼问题
问题描述:笼子里有鸡和兔共50只,脚共140只,求鸡和兔各有多少只?
#include <stdio.h>
int main()
{
int i = 0; // i代表鸡的数量
int sum = 0; // 脚的总数
// 遍历所有可能的鸡的数量(0到50)
for(i = 1; i <= 50; i++)
{
// 计算当前鸡兔数量下的脚总数
sum = 2 * i + 4 * (50 – i);
// 判断是否满足140只脚的条件
if(sum == 140)
{
printf("鸡的个数:%d\\n兔的个数:%d\\n", i, 50 – i);
}
}
return 0;
}
解题思路:
-
设鸡有i只,则兔有(50-i)只
-
鸡有2只脚,兔有4只脚
-
总脚数 = 2×i + 4×(50-i)
-
遍历所有可能的i值,找到满足条件的解
输出效果:

二、循环的嵌套:处理多维问题
2.1 嵌套循环的基本结构
for(表达式A; 表达式B; 表达式C) // 外层循环
{
for(表达式D; 表达式E; 表达式F) // 内层循环
{
语句G; // 循环体
}
}
重要特性:外层循环执行一次,内层循环执行完整的一轮。
2.2 经典案例:九九乘法表
#include <stdio.h>
int main()
{
int i = 0; // 控制行数
int j = 0; // 控制列数
int result = 0; // 存储乘积结果
// 外层循环控制行(1-9行)
for(i = 1; i <= 9; i++)
{
// 内层循环控制列(第i行有i列)
for(j = 1; j <= i; j++)
{
result = j * i;
// %-2d 表示左对齐,占2位宽度
printf("%d*%d=%-2d ", j, i, result);
}
// 每行结束后换行
printf("\\n");
}
return 0;
}
输出效果:

三、while循环:条件驱动型循环
3.1 while循环的基本形式
while(表达式)
{
语句块; // 循环体
}
特点:先判断条件,条件为真才执行循环体。
3.2 示例:计算1到100的和
#include <stdio.h>
int main()
{
int i = 0; // 计数器
int sum = 0; // 累加和
while (i < 101) // 条件:i小于101
{
sum = sum + i; // 累加
i++; // 计数器加1
}
printf("1到100的和为:%d\\n", sum);
return 0;
}
输出效果:
![]()
3.3 死循环:需要谨慎使用
while(1) // 条件永远为真
{
语句块; // 会无限循环执行
}
使用场景:服务器程序、游戏主循环等需要持续运行的程序。使用时一定要确保有退出机制!
四、do…while循环:先执行再判断
4.1 基本形式
do
{
语句块; // 循环体
}while(表达式); // 注意:这里有分号!
特点:先执行一次循环体,再判断条件是否继续循环。
4.2 示例:同样计算1到100的和
#include <stdio.h>
int main()
{
int i = 0;
int sum = 0;
do {
sum += i; // 累加
i++; // 计数器递增
} while(i < 101); // 判断条件
printf("sum = %d\\n", sum);
return 0;
}
输出效果:
![]()
与while的区别:
-
while:先判断,可能一次都不执行
-
do…while:先执行一次,再判断
五、goto语句:有争议的跳转
5.1 基本用法
#include <stdio.h>
int main()
{
int i = 0;
int sum = 0;
loop: // 标签
sum += i;
i++;
if(i < 101)
{
goto loop; // 跳转到loop标签处
}
printf("sum = %d\\n", sum);
return 0;
}
使用建议:goto语句会破坏程序的结构性,使代码难以理解和维护,现代编程中一般不推荐使用。其主要用途是在错误处理时跳转到清理代码段。
六、循环控制语句:精准控制循环流程
6.1 break:立即跳出循环
for(int i = 0; i < 10; i++)
{
if(i == 5)
{
break; // 当i等于5时,立即跳出整个循环
}
printf("%d ", i); // 只打印0 1 2 3 4
}
6.2 continue:跳过本次循环
for(int i = 0; i < 10; i++)
{
if(i == 5)
{
continue; // 当i等于5时,跳过这次循环
}
printf("%d ", i); // 打印0 1 2 3 4 6 7 8 9
}
6.3 return:结束整个函数
int findNumber(int array[], int size, int target)
{
for(int i = 0; i < size; i++)
{
if(array[i] == target)
{
return i; // 找到目标,立即结束函数并返回下标
}
}
return -1; // 没找到,返回-1
}
七、实战项目:寻找水仙花数
7.1 问题分析
水仙花数是指一个三位数,其各位数字的立方和等于该数本身。
例如:153 = 1³ + 5³ + 3³ = 1 + 125 + 27 = 153
7.2 代码实现
#include <stdio.h>
int main()
{
int i = 0; // 遍历100-999的所有三位数
int j = 0; // 计数器,记录找到的水仙花数个数
int sum = 0; // 存储各位数字的立方和
printf("所有水仙花数:\\n");
// 遍历所有三位数
for(i = 100; i <= 999; i++)
{
// 分解数字并计算立方和
// i/100 获取百位数
// (i%100)/10 获取十位数
// i%10 获取个位数
sum = (i/100)*(i/100)*(i/100) +
((i%100)/10)*((i%100)/10)*((i%100)/10) +
(i%10)*(i%10)*(i%10);
// 判断是否为水仙花数
if(sum == i)
{
j++; // 计数器加1
printf("%d ", i);
// 每行打印5个数字
if(j % 5 == 0)
{
printf("\\n");
}
}
}
printf("\\n\\n共找到 %d 个水仙花数\\n", j);
return 0;
}
输出效果:

八、编程技巧与最佳实践
8.1 选择合适的循环结构
-
已知循环次数 → 使用for循环
-
条件驱动,次数未知 → 使用while循环
-
至少执行一次 → 使用do…while循环
8.2 避免常见错误
死循环:确保循环条件最终会变为假
// 错误示例
int i = 0;
while(i < 10)
{
printf("%d", i);
// 忘记写 i++,导致无限循环
}
分号位置错误
// 错误:for后面直接跟分号,循环体为空
for(int i=0; i<10; i++); // 这个分号是错误!
{
printf("%d", i); // 这不在循环内
}
do…while忘记分号
// 错误:缺少分号
do {
// 代码
} while(condition) // 这里需要分号!
作者寄语:编程之路,始于足下。每一次循环,都是向目标的迈进;每一行代码,都是思维的结晶。保持好奇,坚持实践,加油加油!


