循环结构
while 循环
while 循环在条件为 true 时重复执行代码块。每次迭代前先检查条件,若条件为 false 则跳过整个循环体。
CSHARP
int count = 1;
while (count <= 5)
{
Console.WriteLine($"第 {count} 次执行");
count++;
}
TEXT
第 1 次执行
第 2 次执行
第 3 次执行
第 4 次执行
第 5 次执行
💡 如果初始条件就为
false,循环体一次也不会执行。
do...while 循环
do...while 循环先执行一次循环体,然后再检查条件。无论条件是否满足,循环体至少执行一次。
CSHARP
int number;
do
{
Console.WriteLine("请输入一个正数:");
number = int.Parse(Console.ReadLine());
} while (number <= 0);
Console.WriteLine($"你输入的正数是:{number}");
⚠️
do...while 末尾的分号不可省略,这是与 while 循环的语法区别。
for 循环
for 循环将初始化、条件判断和迭代更新合并到一行,适合已知循环次数的场景。
CSHARP
for (int i = 1; i <= 5; i++)
{
Console.WriteLine($"i = {i}");
}
TEXT
i = 1
i = 2
i = 3
i = 4
i = 5
for 语句的三个部分均可省略,但分号必须保留:
CSHARP
int j = 0;
for (; j < 3; )
{
Console.WriteLine($"j = {j}");
j++;
}
TEXT
j = 0
j = 1
j = 2
foreach 循环
foreach 是 C# 的特色循环,用于遍历集合中的每个元素,语法简洁且安全。它适用于数组、列表以及所有实现了 IEnumerable 的集合。
CSHARP
string[] fruits = { "苹果", "香蕉", "橙子" };
foreach (var fruit in fruits)
{
Console.WriteLine($"水果:{fruit}");
}
TEXT
水果:苹果
水果:香蕉
水果:橙子
⚠️
foreach 循环是只读的——迭代变量是只读副本,不能在循环中修改集合元素,也不能在遍历过程中增删集合的元素,否则会抛出 InvalidOperationException。
示例
CSHARP
int[] scores = { 90, 85, 72, 60, 95 };
int sum = 0;
foreach (int score in scores)
{
sum += score;
}
Console.WriteLine($"总分:{sum},平均分:{(double)sum / scores.Length:F1}");
TEXT
总分:402,平均分:80.4
嵌套循环
循环内部再包含循环即为嵌套循环,常用于处理二维数据结构(如矩阵、表格)。
CSHARP
for (int row = 1; row <= 3; row++)
{
for (int col = 1; col <= 4; col++)
{
Console.Write($"{row * col,4}");
}
Console.WriteLine();
}
TEXT
1 2 3 4
2 4 6 8
3 6 9 12
⚠️ 嵌套循环的时间复杂度为 O(n²),层数越多性能越差。实际开发中应尽量避免深层嵌套,可考虑使用 LINQ 或方法提取来优化。
break 与 continue
break
break 立即跳出当前循环,不再执行后续迭代。
CSHARP
for (int i = 0; i < 10; i++)
{
if (i == 5) break;
Console.Write($"{i} ");
}
TEXT
0 1 2 3 4
continue
continue 跳过本次迭代的剩余代码,直接进入下一次迭代。
CSHARP
for (int i = 0; i < 6; i++)
{
if (i % 2 == 0) continue;
Console.Write($"{i} ");
}
TEXT
1 3 5
💡
break 和 continue 只作用于最内层的循环。若需要跳出多层循环,可使用标签标记或标志变量。
循环的常见模式
计数模式
统计满足条件的元素个数:
CSHARP
int[] data = { 12, 25, 8, 33, 17, 6, 41 };
int count = 0;
foreach (int val in data)
{
if (val > 20) count++;
}
Console.WriteLine($"大于20的个数:{count}");
TEXT
大于20的个数:3
累加模式
对一系列数值求和:
CSHARP
int sum = 0;
for (int i = 1; i <= 100; i++)
{
sum += i;
}
Console.WriteLine($"1到100的和:{sum}");
TEXT
1到100的和:5050
查找模式
在集合中寻找目标元素:
CSHARP
int[] numbers = { 3, 7, 15, 22, 9, 31 };
int target = 22;
int index = -1;
for (int i = 0; i < numbers.Length; i++)
{
if (numbers[i] == target)
{
index = i;
break;
}
}
Console.WriteLine(index >= 0 ? $"找到 {target},索引为 {index}" : "未找到");
TEXT
找到 22,索引为 3
示例
综合运用多种模式——统计成绩等级分布并计算平均分:
CSHARP
int[] scores = { 92, 78, 55, 88, 43, 96, 67, 73, 81, 50 };
int excellent = 0, pass = 0, fail = 0, total = 0;
foreach (int s in scores)
{
total += s;
if (s >= 90) excellent++;
else if (s >= 60) pass++;
else fail++;
}
double avg = (double)total / scores.Length;
Console.WriteLine($"优秀:{excellent},及格:{pass},不及格:{fail}");
Console.WriteLine($"平均分:{avg:F1}");
TEXT
优秀:2,及格:5,不及格:3
平均分:72.3
死循环与避免
死循环是指循环条件永远为 true,导致循环永远无法终止。常见的死循环写法:
CSHARP
while (true)
{
}
for (; ; )
{
}
示例
带退出条件的受控循环,避免死循环:
CSHARP
Random rnd = new Random();
int attempts = 0;
while (true)
{
int value = rnd.Next(1, 101);
attempts++;
if (value == 42)
{
Console.WriteLine($"第 {attempts} 次抽到了 42!");
break;
}
if (attempts > 1000)
{
Console.WriteLine("尝试次数过多,退出循环。");
break;
}
}
避免死循环的原则:
- 确保
while和for的循环条件最终会变为false - 在
while (true)或for (; ; )中,务必提供break退出路径 - 设置最大迭代次数作为安全阀
- 注意循环变量的更新逻辑,防止意外跳过递增/递减
🚀 实际开发中,
while (true) 配合 break 是常见的循环模式,但一定要保证所有分支都有退出机会。
❓ 常见问题
Q
while 和 do...while 有什么区别?A
while 先判断再执行,可能一次都不执行;do...while 先执行再判断,至少执行一次。Q
foreach 中能修改集合元素吗?A 不能。迭代变量是只读副本,修改它不会影响原集合;若需修改元素,请使用
for 循环通过索引访问。Q
break 能跳出多层循环吗?A 不能。
break 只跳出最内层循环。如需跳出多层,可使用标志变量或将内层循环提取为方法后用 return 退出。Q
for (; ; ) 和 while (true) 有区别吗?A 功能完全相同,都是死循环写法。
while (true) 语义更清晰,for (; ; ) 在某些编译器中不产生警告。📖 小节
while循环先判断条件,条件为true才执行循环体do...while循环先执行一次循环体,再判断条件for循环适合已知循环次数的场景,语法紧凑foreach循环是 C# 特色,简洁遍历集合,但迭代变量只读- 嵌套循环处理多维数据,注意 O(n²) 性能影响
break立即跳出循环,continue跳过本次迭代- 常见模式:计数、累加、查找、遍历
- 死循环可用
while (true)+break控制,务必设置退出条件
📝 作业
- 编写程序,使用
while循环计算 2 的幂,直到超过 1000 为止,输出所有结果。 - 使用
for循环打印九九乘法表(上三角形式,避免重复)。 - 给定一个字符串数组,使用
foreach统计长度大于 5 的字符串个数。 - 编写程序,使用
do...while让用户反复输入密码,直到输入正确为止(正确密码自定)。 - 使用嵌套
for循环找出 1~50 之间的所有质数。 - 在
for循环中使用continue,输出 1~20 中所有不能被 3 整除的数。



