前置回顾
- 顺序结构:代码从上到下执行一次
- 分支判断(if/switch):选择性执行,代码最多跑一遍
- 循环 :让一段代码重复执行,直到满足退出条件。
C# 4 种循环:
while先判断,后执行(有可能一次都不执行)do-while先执行,后判断(至少执行 1 次)for:已知循环次数首选(计数器循环)foreach:专门遍历集合 / 数组(后面讲数组时重点用)
配套两个循环控制关键字:
break:立刻终止整个循环,跳出循环continue:立刻结束本次循环,直接进入下一轮条件判断
学习路线:
- while 循环
- do-while 循环
- for 循环(最常用,重点)
- break 和 continue
- 嵌套循环
- foreach 简介
- 新手坑点汇总
- 实战练习
1 while 循环:先判断,再执行
语法:
cs
while(布尔条件)
{
//循环体:条件true时重复执行
}
执行流程:
- 检查括号内条件
- ✅true → 进入大括号执行循环体;执行完回到步骤 1 再次判断
- ❌false → 直接跳出 while 循环,继续执行循环后面代码
⚠️关键点:条件一开始就是 false,循环体一次都不会执行 ⚠️死循环大坑:循环内部必须有修改条件的代码,否则条件永远 true,无限循环!
示例 1:打印 1~5
cs
using System;
namespace WhileDemo
{
class Program
{
static void Main(string[] args)
{
int i = 1; //循环计数器,初始化在循环外面
while(i <= 5)
{
Console.WriteLine(i);
i++; //修改计数器!靠近循环末尾,改变条件
}
Console.WriteLine("循环结束");
}
}
}
机理拆解,一步步走
i=1,判断1 <=5→ true → 打印 1 →i++→ i=2- 判断
2 <=5→ true → 打印 2 →i++→ i=3 - 判断
3 <=5→ true → 打印 3 →i++→ i=4 - 判断
4 <=5→ true → 打印 4 →i++→ i=5 - 判断
5 <=5→ true → 打印 5 →i++→ i=6 - 判断
6 <=5→ false → 退出 while,打印 "循环结束"
如果删掉
i++;,i 永远等于 1,条件永远 true → 死循环,程序卡住。
示例 2:条件初始 false,循环不执行
cs
int i = 10;
while(i <=5)
{
Console.WriteLine(i);
i++;
}
Console.WriteLine("结束");
第一次判断 10<=5 → false,循环体一次不跑。
2 do-while 循环:先执行,后判断
语法:
cs
do
{
//循环体,先执行一次
}while(布尔条件); //末尾分号!新手容易漏掉
执行流程:
- 先直接执行一次大括号内循环体
- 再判断 while 条件
- true → 回到 do 继续循环;false → 跳出循环
特点:无论条件真假,循环体至少执行 1 次
示例:打印 1~5
cs
static void Main()
{
int i = 1;
do
{
Console.WriteLine(i);
i++;
} while (i <= 5); //⚠️末尾分号!
Console.WriteLine("循环结束");
}
while 和 do-while 对比小例子
cs
int i = 10;
Console.WriteLine("while:");
while(i <=5)
{
Console.WriteLine(i);
i++;
}
Console.WriteLine("do-while:");
int j = 10;
do
{
Console.WriteLine(j);
j++;
} while (j <=5);
运行结果: while 无输出;do-while 会打印 10,然后判断条件不成立退出。
使用场景:需要至少执行一次,比如:输入密码,先输入,再判断是否正确。
实战示例:密码输入
cs
static void Main()
{
string pwd;
do
{
Console.Write("请输入密码:");
pwd = Console.ReadLine();
} while (pwd != "123456");
Console.WriteLine("密码正确,登录成功");
}
机理:先让用户输入密码,再判断,满足 "至少输入一次" 的需求。
3 for 循环:已知循环次数,最常用⭐
while 的计数器分散在外面、循环内部;for 把初始化、条件、迭代全部写在一行,结构集中。
语法:
cs
for(表达式1; 表达式2; 表达式3)
{
//循环体
}
- 表达式 1:计数器初始化,只执行【一次】,循环开始前
- 表达式 2:循环条件(bool),每次循环前判断
- 表达式 3:迭代更新(i++),循环体执行完之后执行
三个部分用**分号;**隔开,不是逗号!
执行顺序(牢记这个顺序):
- 执行【表达式 1】(仅一次)
- 判断【表达式 2】条件
- true → 执行循环体代码 → 执行【表达式 3】→回到步骤 2
- false → 直接跳出 for 循环
示例:打印 1~5
cs
static void Main()
{
for(int i = 1; i <=5; i++)
{
Console.WriteLine(i);
}
Console.WriteLine("循环结束");
}
机理拆解,逐轮跟踪
int i=1(只执行一次)- 判断
i<=5→ true,打印 1 → 执行i++,i=2 - 判断
i<=5→ true,打印 2 → 执行i++,i=3 - 判断
i<=5→ true,打印 3 → 执行i++,i=4 - 判断
i<=5→ true,打印 4 → 执行i++,i=5 - 判断
i<=5→ true,打印 5 → 执行i++,i=6 - 判断
i<=5→ false,退出循环
变量作用域:
int i在 for 括号内定义,i 只能在 for 循环内部使用,循环外部访问不到。
示例:倒序打印 5 ~ 1
cs
for(int i =5; i >=1; i--)
{
Console.WriteLine(i);
}
for 循环三部分都可以省略(不推荐新手写)
for(;;)三个都空,条件默认为 true → 死循环。
✅什么时候选 for:明确知道循环要执行多少次 (循环 10 次、遍历 10 个数字) ✅什么时候选 while:不知道循环多少次,只知道停止条件(密码输入,直到输入正确)
4 break 与 continue 循环控制关键字
break:立刻终止整个循环,跳出循环
只要执行
break;,循环直接结束,后面循环不再执行。
示例:找到数字 3 就停止循环
cs
for(int i =1; i <=5; i++)
{
if(i == 3)
{
break; //直接跳出for循环
}
Console.WriteLine(i);
}
Console.WriteLine("循环结束");
输出:
cs
1
2
循环结束
机理:i=3 触发 break,整个 for 循环直接终止,后面 i=4、i=5 不再执行。
continue:结束当前这一轮循环,直接进入下一轮条件判断
continue:本轮后面代码不执行,不会跳出整个循环,直接跳到迭代 / 条件判断。
示例:遇到 3 跳过,不打印 3
cs
for(int i =1; i <=5; i++)
{
if(i == 3)
{
continue; //跳过本轮剩下代码,直接i++,下一轮判断
}
Console.WriteLine(i);
}
输出:
cs
1
2
4
5
机理:i=3 触发 continue → Console.WriteLine (i) 被跳过 → 执行 i++,进入下一轮判断。
⚠️ while 里面使用 continue 小心死循环! while 中 continue 会直接跳回条件判断,如果 continue 前面没有写 i++,计数器不会更新,死循环。
cs
int i = 1;
while(i <=5)
{
if(i ==3)
{
continue; //⚠️直接跳去判断 i<=5,i永远等于3!死循环
}
Console.WriteLine(i);
i++;
}
#5 嵌套循环:循环里面再套循环
外层循环执行一次,内层循环完整跑完一整轮。 常用场景:打印九九乘法表、二维表格。
示例:打印 2 行,每行打印 3 个星号
cs
static void Main()
{
//外层:控制行数
for(int row = 1; row <=2; row++)
{
//内层:控制一行里面的星号数量
for(int col = 1; col <=3; col++)
{
Console.Write("*"); //不换行打印
}
Console.WriteLine(); //一行结束,换行
}
}
输出:
cs
***
***
机理:
- row=1:进入外层循环,内层循环 col 从 1 到 3,打印 3 个 * → 换行;内层结束
- row=2:进入外层循环,内层循环 col 从 1 到 3,打印 3 个 * → 换行;内层结束
- row=3,条件不满足,外层循环结束。
break 只能跳出当前所在一层循环,不会一次性跳出多层嵌套循环。
#6 foreach 循环(拓展,遍历数组 / 集合) foreach 专门用来遍历数组、集合,没有计数器,不能修改元素。 语法:
cs
foreach(var item in 数组)
{
}
示例:
cs
int[] arr = {10,20,30};
foreach(int num in arr)
{
Console.WriteLine(num);
}