C#中的条件语句与循环结构
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
表达式只能是整数类型(包括 byte
、sbyte
、short
、ushort
、int
、uint
、long
、ulong
)、字符类型(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 += i
将 i
的值累加到 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
循环,需要实现 IEnumerable
或 IEnumerable<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# 提供了 break
、continue
和 goto
语句来实现这些功能。
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# 程序员可以编写出功能强大、灵活且高效的程序,以满足各种不同的编程需求。无论是开发小型的控制台应用程序,还是大型的企业级软件,这些基本的控制结构都是构建复杂逻辑的基石。