news 2026/7/18 3:32:54

分支语句和循环

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
分支语句和循环

if-else

条件判断语句,只有满足条件才能执行的函数体:

if (条件) { // 条件为 true 时执行 } else { // 条件为 false 时执行 }

如果满足了条件就执行,否则的话就执行另一个函数体内的代码段:

int age = 18; if (age >= 18) { Console.WriteLine("已成年"); } else { Console.WriteLine("未成年"); }

else也可以不写:

int score = 95; if (score >= 60) { Console.WriteLine("及格"); } // 如果不及格,什么也不做,直接跳过

也可以通过else if 进行多条件分支语句的编写:

if (条件1) { // 条件1为 true } else if (条件2) { // 条件1为 false 且 条件2为 true } else if (条件3) { // 条件1、2为 false 且 条件3为 true } else { // 所有条件都为 false }

同样的,if-else也可以嵌套:

bool isLoggedIn = true; bool isAdmin = false; if (isLoggedIn) { if (isAdmin) { Console.WriteLine("欢迎管理员"); } else { Console.WriteLine("欢迎普通用户"); } } else { Console.WriteLine("请先登录"); }

if的参数必须是返回值为bool类型的,只是一个单独的左值或右值编译器时不允许的。

// ❌ 错误(C# 不允许这样写) if (5) { } // 编译错误 // ✅ 正确 if (5 > 3) { }

else匹配的是同一作用域内上方最近的if,所以在编写过程中一定要用{}明确标明作用域,避免写错。

switch

switch语句基于单个变量的多个精确值进行的分支判断。相比于if-else链,switch可读性更高些、

int x = 5; if(x == 1) { } else if(x == 2) { } else if(x == 3) { } else if(x == 4) { } else { } switch(x) { case "1": break; case "2": break; case "3": break; case "4": break; default: }

可以直观的看到switch的代码段更短,更简洁,更方便。

当条件是单个变量且有精确值匹配,分支数在3个以上的时候,用switch,如果不是单个变量且有精确值匹配,那分支数再多也不可以使用switch。

for

结构如下:

for (初始化; 条件; 迭代) { // 循环体 }

初始化只会执行一次,每次循环前都要判断当前条件是否为true,只有为true才可以继续循环,否则退出循环。在执行完循环体后进行迭代,然后再进行下一次循环前判断。

简单示例:

// 打印 1 到 5 for (int i = 1; i <= 5; i++) { Console.WriteLine(i); } // 输出:1 2 3 4 5

for可以省略部分参数,比如:

// 省略初始化(外部已定义) int i = 0; for (; i < 5; i++) { Console.WriteLine(i); } // 省略迭代(在循环体内处理) for (int i = 0; i < 5;) { Console.WriteLine(i); i++; // 手动迭代 } // 省略条件(死循环,需 break 退出) for (;;) { Console.WriteLine("无限循环"); break; // 必须退出 }

for通常和数组搭配使用,通过for对数组中每一位元素进行遍历:

int[] numbers = { 10, 20, 30, 40, 50 }; // 使用索引访问 for (int i = 0; i < numbers.Length; i++) { Console.WriteLine($"numbers[{i}] = {numbers[i]}"); } // 输出: // numbers[0] = 10 // numbers[1] = 20 // ...

for内也可以嵌套for,但是时间复杂度就会变成n*m:

for (int i = 1; i <= 9; i++) { for (int j = 1; j <= i; j++) { Console.Write($"{j}×{i}={i * j}\t"); } Console.WriteLine(); } // 输出: // 1×1=1 // 1×2=2 2×2=4 // 1×3=3 2×3=6 3×3=9 // ...

for中可以使用break和continue进行循环控制,break是跳出整个循环语句:

// 找到第一个偶数就停止 for (int i = 1; i <= 10; i++) { if (i % 2 == 0) { Console.WriteLine($"找到偶数:{i}"); break; // 立即退出循环 } } // 输出:找到偶数:2

continue是跳出本次循环,直接迭代后进入下次循环:

// 打印 1-10 中的所有奇数(跳过偶数) for (int i = 1; i <= 10; i++) { if (i % 2 == 0) continue; // 跳过本次循环 Console.Write(i + " "); } // 输出:1 3 5 7 9

在使用for编写程序时要注意条件不要写错,不然可能无法进入循环或者变成死循环。

不建议使用浮点数作为计数器,因为浮点型可能会有误差,从而导致循环次数出错。

while

先判断条件,条件为true就执行循环体,条件为false就不执行。

int i = 1; while (i <= 5) { Console.WriteLine(i); i++; // 必须更新变量,否则死循环 } // 输出:1 2 3 4 5

while通常用在不知道具体循环次数,只知道循环条件的时候。

do-while

至少执行一次循环,执行后在判断条件是否满足进入下一次循环。

do { // 循环体(至少执行一次) } while (条件);

foreach

foreach (元素类型 变量名 in 集合) { // 处理每个元素 }

执行流程:

1.从集合中取出第一个元素

2.赋值给变量

3.执行循环体

4.回到步骤1,取下一个元素

5.继续循环,直到所有元素遍历完。

举个简单的例子:

string[] fruits = { "Apple", "Banana", "Cherry" }; foreach (string fruit in fruits) { Console.WriteLine(fruit); } // 输出: // Apple // Banana // Cherry

foreach在循环时不可以修改集合中的元素

int[] numbers = { 1, 2, 3, 4, 5 }; foreach (int num in numbers) { num = num * 2; // 编译错误!无法赋值 }

foreach不需要手动管理索引,但也无法获取当前元素的索引位置。但可以用以下方法获取索引:

// C# 7.0+ 使用元组 var names = new List<string> { "Alice", "Bob", "Charlie" }; foreach (var (index, name) in names.Select((n, i) => (i, n))) { Console.WriteLine($"{index}: {name}"); } // 输出: // 0: Alice // 1: Bob // 2: Charlie // 或者使用索引变量手动增加 int idx = 0; foreach (var name in names) { Console.WriteLine($"{idx}: {name}"); idx++; }

foreach支持所有实现了IEnumerable的的集合。

// 任何实现了 IEnumerable 的集合都可以用 foreach IEnumerable<int> numbers = GetNumbers(); // 假设返回 IEnumerable<int> foreach (int num in numbers) { Console.WriteLine(num); }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/18 3:32:39

Rust错误处理:thiserror与anyhow实战指南

1. Rust错误处理生态概览在Rust系统编程实践中&#xff0c;错误处理机制的设计直接影响代码的健壮性和可维护性。不同于传统异常机制&#xff0c;Rust采用显式的Result<T, E>类型进行错误传播&#xff0c;这种设计哲学催生了丰富的错误处理库生态。其中anyhow和thiserror…

作者头像 李华
网站建设 2026/7/18 3:29:36

PHPCMS深度解析:国产CMS的模块化设计与实战优化

1. PHPCMS概述&#xff1a;一个被低估的国产CMS系统2005年诞生的PHPCMS是国内最早一批采用MVC架构的内容管理系统&#xff0c;其核心开发团队来自当时国内知名的PHPWind论坛系统。与同期其他CMS不同&#xff0c;PHPCMS从设计之初就定位为"内容管理框架"而非单纯的后台…

作者头像 李华
网站建设 2026/7/18 3:27:36

虚幻引擎多人竞技场游戏开发:网络同步与延迟补偿实战指南

1. 项目概述&#xff1a;从零构建一个多人竞技场如果你和我一样&#xff0c;是个对动作游戏和多人对抗着迷的开发者&#xff0c;那么用Unreal Engine&#xff08;虚幻引擎&#xff0c;简称UE&#xff09;亲手打造一个属于自己的多人竞技场游戏&#xff0c;绝对是一件充满挑战又…

作者头像 李华
网站建设 2026/7/18 3:26:50

PCIe初始化流程详解:链路训练、设备枚举与资源分配

1. PCIe初始化流程全景概览PCIe总线作为现代计算机系统中最重要的高速串行总线之一&#xff0c;其初始化过程直接决定了系统能否正确识别和使用各类扩展设备。完整的PCIe初始化流程可以划分为三个关键阶段&#xff1a;链路训练&#xff08;Link Training&#xff09;、设备枚举…

作者头像 李华
网站建设 2026/7/18 3:25:24

信息论速成指南:工程师的熵、互信息与信道容量实战手册

1. 项目概述&#xff1a;这不是一本教科书&#xff0c;而是一张信息高速公路的速查地图“&#x1f685; Information Theory for People in a Hurry”这个标题本身就是一个精准的用户画像声明——它不面向准备花三个月啃完香农原著的研究生&#xff0c;也不服务于需要推导互信息…

作者头像 李华
网站建设 2026/7/18 3:23:55

PySpark MLlib千万级分类实战:从集群训练到生产部署

1. 项目概述&#xff1a;用 PySpark MLlib 做分类&#xff0c;不是“跑通代码”&#xff0c;而是让模型真正在集群上扛住百万级样本你手头有一份 800 万条用户行为日志&#xff0c;字段包括设备ID、页面停留时长、点击次数、是否加购、是否下单、地域编码、访问时段等——你想预…

作者头像 李华