MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

C#中的条件语句与循环结构

2021-02-257.7k 阅读

C# 中的条件语句

在 C# 编程中,条件语句允许程序根据特定条件执行不同的代码块。这为程序赋予了灵活性和决策能力,使其能够根据不同的输入或运行时状态采取不同的行动。C# 主要提供了三种类型的条件语句:if - else 语句、switch - case 语句和条件运算符(? :)。

if - else 语句

if - else 语句是最基本的条件语句,它根据一个布尔表达式的值来决定执行哪一段代码。语法如下:

if (布尔表达式)
{
    // 如果布尔表达式为 true,执行这里的代码
}
else
{
    // 如果布尔表达式为 false,执行这里的代码
}

例如,我们要编写一个程序来判断一个数是否为正数:

int number = 10;
if (number > 0)
{
    Console.WriteLine("这个数是正数");
}
else
{
    Console.WriteLine("这个数不是正数");
}

在上述代码中,if 关键字后面的括号内是一个布尔表达式 number > 0。如果这个表达式的值为 true,即 number 大于 0,那么就会执行 if 块中的代码,输出“这个数是正数”;否则,执行 else 块中的代码,输出“这个数不是正数”。

if - else 语句还可以进行嵌套,以处理更复杂的条件判断。例如:

int score = 75;
if (score >= 60)
{
    if (score >= 80)
    {
        Console.WriteLine("成绩良好");
    }
    else
    {
        Console.WriteLine("成绩及格");
    }
}
else
{
    Console.WriteLine("成绩不及格");
}

在这段代码中,首先判断 score 是否大于等于 60。如果是,再进一步判断 score 是否大于等于 80,根据不同的结果输出不同的信息。如果 score 小于 60,则直接输出“成绩不及格”。

switch - case 语句

switch - case 语句用于根据一个表达式的值来选择执行多个分支中的一个。它通常比嵌套的 if - else 语句更简洁,特别是在处理多个离散值的情况时。语法如下:

switch (表达式)
{
    case 值1:
        // 当表达式的值等于值1时执行这里的代码
        break;
    case 值2:
        // 当表达式的值等于值2时执行这里的代码
        break;
    default:
        // 当表达式的值与所有 case 的值都不匹配时执行这里的代码
        break;
}

例如,我们根据一个代表星期几的数字输出对应的星期名称:

int dayOfWeek = 3;
switch (dayOfWeek)
{
    case 1:
        Console.WriteLine("星期一");
        break;
    case 2:
        Console.WriteLine("星期二");
        break;
    case 3:
        Console.WriteLine("星期三");
        break;
    case 4:
        Console.WriteLine("星期四");
        break;
    case 5:
        Console.WriteLine("星期五");
        break;
    case 6:
        Console.WriteLine("星期六");
        break;
    case 7:
        Console.WriteLine("星期日");
        break;
    default:
        Console.WriteLine("无效的输入");
        break;
}

switch 语句中,表达式 的值会依次与各个 case 后面的 进行比较。当找到匹配的值时,就会执行对应的 case 块中的代码,直到遇到 break 语句为止。break 语句用于跳出 switch 块,防止继续执行下一个 case 块的代码。如果 表达式 的值与所有 case 的值都不匹配,就会执行 default 块中的代码。

需要注意的是,switch 表达式只能是整数类型(包括 bytesbyteshortushortintuintlongulong)、字符类型(char)、字符串类型(string)或枚举类型。

条件运算符(? :)

条件运算符(? :)也称为三元运算符,它是一种简洁的条件判断方式,可以在一行代码中实现简单的 if - else 逻辑。语法如下:

布尔表达式? 表达式1 : 表达式2;

如果 布尔表达式 的值为 true,则返回 表达式1 的值;否则,返回 表达式2 的值。例如:

int a = 10;
int b = 20;
int max = a > b? a : b;
Console.WriteLine("较大的数是: " + max);

在上述代码中,a > b 是布尔表达式。如果 a 大于 b,则 max 被赋值为 a;否则,max 被赋值为 b。这种方式在需要快速根据条件返回不同值的情况下非常方便,代码更加简洁。

C# 中的循环结构

循环结构允许程序重复执行一段代码,直到满足特定条件为止。这在处理需要多次执行相同操作的场景中非常有用,例如遍历数组、计算数列等。C# 提供了几种不同类型的循环结构,包括 for 循环、while 循环、do - while 循环和 foreach 循环。

for 循环

for 循环用于在已知循环次数的情况下执行循环。它的语法结构如下:

for (初始化表达式; 条件表达式; 迭代表达式)
{
    // 循环体代码
}
  • 初始化表达式:在循环开始前执行一次,通常用于初始化循环变量。
  • 条件表达式:在每次循环迭代前检查,如果为 true,则执行循环体;如果为 false,则终止循环。
  • 迭代表达式:在每次循环体执行完毕后执行,通常用于更新循环变量。

例如,我们要计算 1 到 10 的整数之和:

int sum = 0;
for (int i = 1; i <= 10; i++)
{
    sum += i;
}
Console.WriteLine("1 到 10 的整数之和为: " + sum);

在这个例子中,int i = 1 是初始化表达式,将循环变量 i 初始化为 1;i <= 10 是条件表达式,只要 i 小于等于 10,循环就会继续;i++ 是迭代表达式,每次循环结束后 i 自增 1。循环体 sum += ii 的值累加到 sum 中。

for 循环还可以嵌套使用,以处理多维数据结构等复杂情况。例如,我们要打印一个九九乘法表:

for (int i = 1; i <= 9; i++)
{
    for (int j = 1; j <= i; j++)
    {
        Console.Write(j + " * " + i + " = " + i * j + "\t");
    }
    Console.WriteLine();
}

外层 for 循环控制行数,内层 for 循环控制每行的乘法运算数量。内层循环的条件 j <= i 确保了乘法表的上三角部分被正确打印。

while 循环

while 循环用于在条件满足的情况下重复执行一段代码。语法如下:

while (条件表达式)
{
    // 循环体代码
}

只要 条件表达式 的值为 true,就会不断执行循环体中的代码。例如,我们要实现一个简单的倒计时程序:

int count = 10;
while (count > 0)
{
    Console.WriteLine(count);
    count--;
}
Console.WriteLine("倒计时结束!");

在这个例子中,count > 0 是条件表达式。只要 count 大于 0,就会执行循环体,打印 count 的值并将其减 1。当 count 等于 0 时,条件表达式为 false,循环终止。

使用 while 循环时需要注意确保条件表达式最终会变为 false,否则会导致无限循环。例如:

// 下面的代码会导致无限循环
while (true)
{
    Console.WriteLine("这是一个无限循环");
}

do - while 循环

do - while 循环与 while 循环类似,但它会先执行一次循环体,然后再检查条件表达式。语法如下:

do
{
    // 循环体代码
} while (条件表达式);

例如,我们要实现一个简单的登录验证程序,用户必须输入正确的密码才能退出循环:

string password;
do
{
    Console.Write("请输入密码: ");
    password = Console.ReadLine();
    if (password != "123456")
    {
        Console.WriteLine("密码错误,请重新输入!");
    }
} while (password != "123456");
Console.WriteLine("登录成功!");

在这个例子中,无论用户第一次输入的密码是否正确,都会先执行一次循环体,提示用户输入密码。然后检查密码是否正确,如果不正确,提示错误并继续循环;如果正确,则终止循环并输出“登录成功!”。

foreach 循环

foreach 循环用于遍历数组、集合等可枚举类型的元素。语法如下:

foreach (类型 变量 in 可枚举对象)
{
    // 循环体代码,变量会依次获取可枚举对象中的每个元素
}

例如,我们有一个整数数组,要打印数组中的每个元素:

int[] numbers = { 1, 2, 3, 4, 5 };
foreach (int number in numbers)
{
    Console.WriteLine(number);
}

在这个例子中,int number 声明了一个变量 number,它的类型与数组元素的类型相同。in numbers 表示 foreach 循环将遍历 numbers 数组。在每次循环中,number 会依次获取数组中的每个元素,并执行循环体,打印出该元素的值。

foreach 循环在遍历集合时非常方便,因为它不需要手动管理索引,并且代码更加简洁。对于自定义的集合类型,如果要使用 foreach 循环,需要实现 IEnumerableIEnumerable<T> 接口。例如:

using System;
using System.Collections;

class MyCollection : IEnumerable
{
    private int[] data = { 10, 20, 30, 40, 50 };
    public IEnumerator GetEnumerator()
    {
        for (int i = 0; i < data.Length; i++)
        {
            yield return data[i];
        }
    }
}

class Program
{
    static void Main()
    {
        MyCollection myCol = new MyCollection();
        foreach (int num in myCol)
        {
            Console.WriteLine(num);
        }
    }
}

在上述代码中,MyCollection 类实现了 IEnumerable 接口,并提供了 GetEnumerator 方法。GetEnumerator 方法使用 yield return 语句逐个返回集合中的元素,从而使 MyCollection 类型的对象可以在 foreach 循环中被遍历。

循环控制语句

在循环执行过程中,有时需要提前终止循环或者跳过某次循环迭代,C# 提供了 breakcontinuegoto 语句来实现这些功能。

break 语句

break 语句用于立即终止当前循环,跳出循环体。它通常与条件语句一起使用,当满足某个条件时提前结束循环。例如,我们在一个循环中查找特定的数字:

int[] numbers = { 10, 20, 30, 40, 50 };
int target = 30;
for (int i = 0; i < numbers.Length; i++)
{
    if (numbers[i] == target)
    {
        Console.WriteLine("找到了目标数字: " + target);
        break;
    }
}

在这个例子中,当 numbers[i] 等于 target 时,执行 break 语句,立即跳出 for 循环,不再继续执行后续的循环迭代。

break 语句也可以用于 switch - case 语句中,用于跳出 switch 块。

continue 语句

continue 语句用于跳过当前循环迭代中剩余的代码,直接进入下一次迭代。例如,我们要打印 1 到 10 中的奇数:

for (int i = 1; i <= 10; i++)
{
    if (i % 2 == 0)
    {
        continue;
    }
    Console.WriteLine(i);
}

在这个例子中,当 i 是偶数时(i % 2 == 0),执行 continue 语句,跳过本次循环中 Console.WriteLine(i) 这一行代码,直接进入下一次循环,从而只打印出奇数。

goto 语句

goto 语句用于无条件地跳转到指定的标签处。虽然 goto 语句在某些情况下可以提供快速的流程控制,但过度使用会使代码的逻辑变得混乱,可读性降低,因此一般不建议使用。语法如下:

goto 标签名;
// 其他代码
标签名:
// 跳转到这里执行的代码

例如:

int num = 5;
if (num > 0)
{
    goto PositiveNumber;
}
else
{
    goto NegativeNumber;
}
PositiveNumber:
Console.WriteLine("数字是正数");
return;
NegativeNumber:
Console.WriteLine("数字是负数");

在上述代码中,根据 num 的值,使用 goto 语句跳转到不同的标签处执行相应的代码。然而,这种方式使得代码的执行流程不直观,难以维护,在实际编程中应尽量避免使用 goto 语句,而使用条件语句和循环结构来实现更清晰的逻辑。

通过合理运用条件语句和循环结构,C# 程序员可以编写出功能强大、灵活且高效的程序,以满足各种不同的编程需求。无论是开发小型的控制台应用程序,还是大型的企业级软件,这些基本的控制结构都是构建复杂逻辑的基石。