当前位置: 首页 > news >正文

分支语句和循环

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); }
http://www.cnnetsun.cn/news/3470947.html

相关文章:

  • Rust错误处理:thiserror与anyhow实战指南
  • PHPCMS深度解析:国产CMS的模块化设计与实战优化
  • 虚幻引擎多人竞技场游戏开发:网络同步与延迟补偿实战指南
  • PCIe初始化流程详解:链路训练、设备枚举与资源分配
  • 信息论速成指南:工程师的熵、互信息与信道容量实战手册
  • PySpark MLlib千万级分类实战:从集群训练到生产部署
  • 《我的世界》服务器防熊指令全攻略:权限控制与行为监控实战
  • 遗传算法实战心法:从种群初始化到收敛判据的12个关键要点
  • Claude Code VS Code插件安装与IDE级AI工作流配置指南
  • 敏捷开发Alpha阶段技术复盘与架构优化实践
  • 学习agent日记day1:python从入门到如厕
  • 剑网1棍丐竞技实战:从技能连招到团队配合进阶指南
  • 软件工程转数据分析,真的能行吗?过来人给你交个底
  • Google MCP Server实战指南:让AI真正动手做事
  • 【数据分享】2010—2020年我国乡镇级的逐年分部门(服务业、工业、农业)GDP数据(Shp/Excel格式)
  • Java框架选型与性能优化实战指南
  • Java爬虫HTTPS证书验证失败:SunCertPathBuilderException排查与解决方案
  • 基于YOLOv8的蜜蜂识别检测系统:从环境配置到UI部署全流程
  • Java面试核心知识点与实战技巧全解析
  • AI营销智能体:2026核心能力与选型指南
  • 本地化LLM部署方案:Ollama、OpenLLM、LocalAI与Dify实战指南
  • ▲基于OFDM+16QAM的通信链路matlab性能仿真,包含LDPC,Schmidl-Cox频偏估计,加扰解扰,定时同步和LS信道估计
  • MyBatis分页插件PageHelper原理与实战指南
  • Android导航模式演进:从Menu Button到Toolbar实践
  • Vue数据可视化实战:v-charts组件库详解
  • 黑客松 winning 公式:72小时从代码到支票的叙事工程
  • 百度网盘下载加速终极方案:BaiduPCS-Web免费突破限速完整教程
  • Android性能监控实战:SoloPi悬浮窗实时监测CPU、内存、FPS与网络
  • Flutter重构webOS:智能电视应用开发的技术革新
  • Windows内核隔离驱动兼容性问题解析与解决方案