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