天天看点

2.4C#的流程控制语句

C#的流程控制语句

流程控制语句是编程语言中非常重要的一部分,它们可以控制程序的执行顺序和逻辑,使得程序可以根据不同的情况做出不同的反应。C#中有三种基本的流程控制语句:顺序结构、选择结构和循环结构。本文将介绍这三种结构的语法和用法,并给出一些代码示例。

顺序结构

顺序结构是最简单的一种流程控制语句,它表示程序按照代码的书写顺序从上到下依次执行每一条语句,不会发生跳转。例如:

Console.WriteLine("Hello, world!"); // 第一条语句
int a = 10; // 第二条语句
int b = a + 5; // 第三条语句
Console.WriteLine(b); // 第四条语句
           

上面的代码会依次输出:

Hello, world!
15
           

选择结构

选择结构是根据给定的条件来决定执行哪一段代码的流程控制语句,它可以实现程序的分支逻辑。C#中有两种选择结构:if结构和switch结构。

if结构

if结构是最常用的一种选择结构,它的基本语法如下:

if (条件表达式)
{
    条件成立时执行的语句;
}
else
{
    条件不成立时执行的语句;
}
           

if结构会先判断条件表达式的真假,如果为真,则执行大括号中的语句,如果为假,则执行else后面的语句。else部分可以省略,如果省略,则表示条件不成立时不执行任何操作。例如:

int score = 80; // 定义一个分数变量
if (score >= 60) // 判断分数是否及格
{
    Console.WriteLine("Pass"); // 及格则输出Pass
}
else
{
    Console.WriteLine("Fail"); // 不及格则输出Fail
}
           

上面的代码会输出:

Pass
           

if结构还可以嵌套使用,即在一个if结构中再包含一个或多个if结构,以实现更复杂的逻辑判断。例如:

int score = 80; // 定义一个分数变量
if (score >= 90) // 判断分数是否为优秀
{
    Console.WriteLine("Excellent"); // 优秀则输出Excellent
}
else // 如果不是优秀,则继续判断是否为良好或者及格
{
    if (score >= 80) // 判断分数是否为良好
    {
        Console.WriteLine("Good"); // 良好则输出Good
    }
    else // 如果不是良好,则继续判断是否为及格
    {
        if (score >= 60) // 判断分数是否为及格
        {
            Console.WriteLine("Pass"); // 及格则输出Pass
        }
        else // 如果不是及格,则输出Fail
        {
            Console.WriteLine("Fail");
        }
    }
}
           

上面的代码会输出:

Good
           

为了简化嵌套的if结构,C#还提供了else if的语法,它可以将多个if结构连接起来,形成一个分支链,每个分支对应一个条件和一个执行语句。例如:

int score = 80; // 定义一个分数变量
if (score >= 90) // 判断分数是否为优秀
{
    Console.WriteLine("Excellent"); // 优秀则输出Excellent
}
else if (score >= 80) // 判断分数是否为良好
{
    Console.WriteLine("Good"); // 良好则输出Good
}
else if (score >= 60) // 判断分数是否为及格
{
    Console.WriteLine("Pass"); // 及格则输出Pass
}
else // 如果都不满足,则输出Fail
{
    Console.WriteLine("Fail");
}
           

上面的代码与前面的嵌套if结构的效果是一样的,但是更加简洁和清晰。

switch结构

switch结构是另一种选择结构,它的基本语法如下:

switch (要判断的变量或表达式)
{
    case 值1:
        执行语句1;
        break;
    case 值2:
        执行语句2;
        break;
    ...
    case 值n:
        执行语句n;
        break;
    default:
        默认执行语句;
        break;
}
           

switch结构会根据要判断的变量或表达式的值与每个case后面的值进行比较,如果相等,则执行对应的语句,并跳出switch结构。如果都不相等,则执行default后面的语句,并跳出switch结构。default部分可以省略,如果省略,则表示没有匹配的值时不执行任何操作。break语句是用来结束每个case分支的,如果不写break语句,则会发生穿透现象,即继续执行下一个case分支的语句,直到遇到break语句或者switch结构结束为止。例如:

int month = 3; // 定义一个月份变量
switch (month) // 根据月份判断季节
{
    case 12:
    case 1:
    case 2:
        Console.WriteLine("Winter"); // 冬季则输出Winter
        break;
    case 3:
    case 4:
    case 5:
        Console.WriteLine("Spring"); // 春季则输出Spring
        break;
    case 6:
    case 7:
    case 8:
        Console.WriteLine("Summer"); // 夏季则输出Summer
        break;
    case 9:
    case 10:
    case 11:
        Console.WriteLine("Autumn"); // 秋季则输出Autumn
        break;
    default:
        Console.WriteLine("Invalid month"); // 非法月份则输出Invalid month
        break;
}
           

上面的代码会输出:

Spring
           

注意,在C#中,switch结构可以判断的变量或表达式不仅限于整型或枚举型,还可以是字符串型。例如:

string fruit = "apple"; // 定义一个水果变量
switch (fruit) // 根据水果判断颜色
{
    case "apple":
        Console.WriteLine("Red"); // 苹果则输出Red
        break;
    case "banana":
        Console.WriteLine("Yellow"); // 香蕉则输出Yellow
        break;
    case "orange":
        Console.WriteLine("Orange"); // 橘子则输出Orange
        break;
    default:
        Console.WriteLine("Unknown color"); // 其他则输出Unknown color
        break;
}
           

上面的代码会输出:

Red           

循环结构

循环结构是在给定条件成立的情况下,反复执行某一段代码的流程控制语句,它可以实现程序的重复逻辑。C#中有四种循环结构:while循环、do-while循环、for循环和foreach循环。

while循环

while循环是最基本的一种循环结构,它的基本语法如下:

while (循环条件)
{
    循环体;
}
           

while循环会先判断循环条件的真假,如果为真,则执行大括号中的语句,然后再次判断循环条件,如此反复,直到循环条件为假时,跳出while循环。如果一开始循环条件就为假,则不执行任何操作。例如:

int i = 1; // 定义一个计数变量
while (i <= 10) // 判断计数变量是否小于等于10
{
    Console.WriteLine(i); // 输出计数变量的值
    i++; // 计数变量自增1
}
           

上面的代码会输出:

1
2
3
4
5
6
7
8
9
10
           

在while循环中,可以使用continue语句来结束当前的循环,进入下一次的循环;也可以使用break语句来终止整个循环,不再执行后续的操作。例如:

int i = 1; // 定义一个计数变量
while (i <= 10) // 判断计数变量是否小于等于10
{
    if (i % 2 == 0) // 判断计数变量是否为偶数
    {
        i++; // 计数变量自增1
        continue; // 结束当前的循环,进入下一次的循环
    }
    Console.WriteLine(i); // 输出计数变量的值
    i++; // 计数变量自增1
    if (i > 5) // 判断计数变量是否大于5
    {
        break; // 终止整个循环,不再执行后续的操作
    }
}
           

上面的代码会输出:

1
3
5
           

do-while循环

do-while循环是一种先执行后判断的循环结构,它的基本语法如下:

do
{
    循环体;
} while (循环条件);
           

do-while循环会先执行一次大括号中的语句,然后判断循环条件的真假,如果为真,则继续执行大括号中的语句,然后再次判断循环条件,如此反复,直到循环条件为假时,跳出do-while循环。do-while循环至少会执行一次循环体。例如:

int i = 1; // 定义一个计数变量
do 
{
    Console.WriteLine(i); // 输出计数变量的值
    i++; // 计数变量自增1
} while (i <= 10); // 判断计数变量是否小于等于10
           

上面的代码会输出:

1
2
3
4
5
6
7
8
9
10
           

在do-while循环中,也可以使用continue和break语句来控制循环的流程,用法与while循环相同。

for循环

for循环是一种在有明确的循环次数时使用的循环结构,它的基本

已收到消息. 好的,我会继续写下去。以下是我生成的文章的后续内容: ## 循环结构 循环结构是在给定条件成立的情况下,反复执行某一段代码的流程控制语句,它可以实现程序的重复逻辑。C#中有四种循环结构:while循环、do-while循环、for循环和foreach循环。 ### while循环 while循环是最基本的一种循环结构,它的基本语法如下: ```csharp while (循环条件) { 循环体; } ``` while循环会先判断循环条件的真假,如果为真,则执行大括号中的语句,然后再次判断循环条件,如此反复,直到循环条件为假时,跳出while循环。如果一开始循环条件就为假,则不执行任何操作。例如: ```csharp int i = 1; // 定义一个计数变量 while (i <= 10) // 判断计数变量是否小于等于10 { Console.WriteLine(i); // 输出计数变量的值 i++; // 计数变量自增1 } ``` 上面的代码会输出: ``` 1 2 3 4 5 6 7 8 9 10 ``` 在while循环中,可以使用continue语句来结束当前的循环,进入下一次的循环;也可以使用break语句来终止整个循环,不再执行后续的操作。例如: ```csharp int i = 1; // 定义一个计数变量 while (i <= 10) // 判断计数变量是否小于等于10 { if (i % 2 == 0) // 判断计数变量是否为偶数 { i++; // 计数变量自增1 continue; // 结束当前的循环,进入下一次的循环 } Console.WriteLine(i); // 输出计数变量的值 i++; // 计数变量自增1 if (i > 5) // 判断计数变量是否大于5 { break; // 终止整个循环,不再执行后续的操作 } } ``` 上面的代码会输出: ``` 1 3 5 ``` ### do-while循环 do-while循环是一种先执行后判断的循环结构,它的基本语法如下: ```csharp do { 循环体; } while (循环条件); ``` do-while循环会先执行一次大括号中的语句,然后判断循环条件的真假,如果为真,则继续执行大括号中的语句,然后再次判断循环条件,如此反复,直到循环条件为假时,跳出do-while循环。do-while循环至少会执行一次循环体。例如: ```csharp int i = 1; // 定义一个计数变量 do { Console.WriteLine(i); // 输出计数变量的值 i++; // 计数变量自增1 } while (i <= 10); // 判断计数变量是否小于等于10 ``` 上面的代码会输出: ``` 1 2 3 4 5 6 7 8 9 10 ``` 在do-while循环中,也可以使用continue和break语句来控制循环的流程,用法与while循环相同。 ### for循环 for循环是一种在有明确的循环次数时使用的循环结构,它的基本

3共20

继续写下去

已发送电子邮件. 继续写下去

好的,我会继续写下去。以下是我生成的文章的后续内容:

for循环是一种在有明确的循环次数时使用的循环结构,它的基本语法如下:

for (初始条件; 循环条件; 循环变化)
{
    循环体;
}
           

for循环会先执行一次初始条件,然后判断循环条件的真假,如果为真,则执行大括号中的语句,然后执行循环变化,再次判断循环条件,如此反复,直到循环条件为假时,跳出for循环。如果一开始循环条件就为假,则不执行任何操作。例如:

for (int i = 1; i <= 10; i++) // 定义一个计数变量i,并给它赋值为1,判断i是否小于等于10,每次循环后i自增1
{
    Console.WriteLine(i); // 输出计数变量i的值
}
           

上面的代码会输出:

1
2
3
4
5
6
7
8
9
10
           

在for循环中,也可以使用continue和break语句来控制循环的流程,用法与while循环相同。

foreach循环

foreach循环是一种用来遍历数组或集合中的每个元素的循环结构,它的基本语法如下:

foreach (var item in list)
{
    循环体;
}
           

foreach循环会依次取出list中的每个元素,并赋值给item变量,然后执行大括号中的语句,直到遍历完所有的元素为止。list可以是任何实现了IEnumerable接口的类型,例如数组、列表、字典等。item可以是任何与元素类型相同或兼容的类型,例如var、object等。例如:

int[] array = new int[] { 1, 2, 3, 4, 5 }; // 定义一个整型数组
foreach (int num in array) // 遍历数组中的每个元素,并赋值给num变量
{
    Console.WriteLine(num); // 输出num变量的值
}
           

上面的代码会输出:

1
2
3
4
5
           

在foreach循环中,也可以使用continue和break语句来控制循环的流程,用法与while循环相同。

异常处理语句

异常处理语句是用来处理程序运行过程中可能出现的错误或异常情况的流程控制语句,它可以使程序更加健壮和稳定。C#中有两种异常处理语句:try-catch语句和try-finally语句。

try-catch语句

try-catch语句是最常用的一种异常处理语句,它的基本语法如下:

try
{
    可能会出现异常的代码;
}
catch (Exception ex) // ex是捕获到的异常对象
{
    出现异常后要执行的代码;
}
           

try-catch语句会先尝试执行try中的代码,如果没有出现异常,则正常执行完毕;如果出现异常,则跳转到catch中执行catch中的代码,并捕获异常对象ex,可以通过ex获取异常的相关信息,例如ex.Message表示异常消息,ex.StackTrace表示异常堆栈等。例如:

try
{
    int a = 10; // 定义一个整型变量a,并赋值为10
    int b = 0; // 定义一个整型变量b,并赋值为0
    int c = a / b; // 定义一个整型变量c,并赋值为a除以b Console.WriteLine©; // 输出c的值 
} catch (Exception ex) // 捕获异常对象ex 
{ 
  Console.WriteLine(ex.Message); // 输出异常消息 
}           

上面的代码会输出:

Attempted to divide by zero.           

因为在try中的代码中,a除以b会导致一个除零异常,所以程序会跳转到catch中,输出异常对象ex的消息属性,表示出现了什么异常。 try-catch语句还可以嵌套使用,即在一个try-catch语句中再包含一个或多个try-catch语句,以实现更细致的异常处理。例如:

try
{
    try
    {
        int a = 10; // 定义一个整型变量a,并赋值为10
        int b = 0; // 定义一个整型变量b,并赋值为0
        int c = a / b; // 定义一个整型变量c,并赋值为a除以b
        Console.WriteLine(c); // 输出c的值
    }
    catch (DivideByZeroException ex) // 捕获除零异常对象ex
    {
        Console.WriteLine(ex.Message); // 输出异常消息
    }
}
catch (Exception ex) // 捕获其他异常对象ex
{
    Console.WriteLine(ex.Message); // 输出异常消息
}           

上面的代码会输出:

Attempted to divide by zero.
           

因为在内层的try中的代码中,a除以b会导致一个除零异常,所以程序会跳转到内层的catch中,输出异常对象ex的消息属性,表示出现了什么异常。由于内层的catch已经处理了这个异常,所以外层的catch不会再执行。

try-catch语句还可以有多个catch分支,每个catch分支对应一种特定类型的异常,这样可以根据不同类型的异常做出不同的处理。例如:

try
{
    int[] array = new int[] { 1, 2, 3 }; // 定义一个整型数组,并赋值为1,2,3
    int index = 3; // 定义一个索引变量,并赋值为3
    int num = array[index]; // 定义一个整型变量,并赋值为数组中索引为index的元素
    Console.WriteLine(num); // 输出num的值
}
catch (IndexOutOfRangeException ex) // 捕获索引越界异常对象ex
{
    Console.WriteLine("Index out of range: " + ex.Message); // 输出异常消息
}
catch (Exception ex) // 捕获其他异常对象ex
{
    Console.WriteLine("Other exception: " + ex.Message); // 输出异常消息
}
           

上面的代码会输出:

Index out of range: Index was outside the bounds of the array.
           

因为在try中的代码中,index的值为3,超出了数组array的范围,所以程序会跳转到第一个catch分支,输出异常对象ex的消息属性,并加上一些提示信息,表示出现了索引越界异常。如果在try中的代码中出现了其他类型的异常,则会跳转到第二个catch分支,输出异常对象ex的消息属性,并加上一些提示信息,表示出现了其他类型的异常。

try-finally语句

try-finally语句是一种无论是否出现异常都要执行某些操作的异常处理语句,它的基本语法如下:

try
{
    可能会出现异常的代码;
}
finally
{
    无论是否出现异常都要执行的代码;
}
           

try-finally语句会先尝试执行try中的代码,如果没有出现异常,则正常执行完毕,然后执行finally中的代码;如果出现异常,则跳过try中剩余的代码,直接执行finally中的代码。无论是否出现异常,finally中的代码都会被执行。例如:

try
{
    int a = 10; // 定义一个整型变量a,并赋值为10
    int b = 0; // 定义一个整型变量b,并赋值为0
    int c = a / b; // 定义一个整型变量c,并赋值为a除以b
    Console.WriteLine(c); // 输出c的值
}
finally
{
    Console.WriteLine("Finally"); // 输出Finally
}
           

上面的代码会输出:

Finally
           

因为在try中的代码中,a除以b会导致一个除零异常,所以程序会跳过try中剩余的代码,直接执行finally中的代码,输出Finally。如果没有出现异常,则会先输出c的值,然后输出Finally。

try-finally语句一般用于释放一些资源,例如文件、数据库连接、网络连接等,以确保这些资源不会因为异常而泄露或占用。

try-finally语句可以和try-catch语句结合使用,形成一个完整的异常处理机制,即先尝试执行代码,如果出现异常,则捕获并处理异常,无论是否出现异常,都执行一些必要的操作。例如:

try
{
    int a = 10; // 定义一个整型变量a,并赋值为10
    int b = 0; // 定义一个整型变量b,并赋值为0
    int c = a / b; // 定义一个整型变量c,并赋值为a除以b
    Console.WriteLine(c); // 输出c的值
}
catch (Exception ex) // 捕获异常对象ex
{
    Console.WriteLine(ex.Message); // 输出异常消息
}
finally
{
    Console.WriteLine("Finally"); // 输出Finally
}
           

上面的代码会输出:

Attempted to divide by zero.
Finally
           

因为在try中的代码中,a除以b会导致一个除零异常,所以程序会跳转到catch中执行catch中的代码,并捕获异常对象ex,输出异常对象ex的消息属性,表示出现了什么异常。然后程序会执行finally中的代码,输出Finally。

总结

本文介绍了C#中的流程控制语句,包括顺序结构、选择结构、循环结构和异常处理语句。这些语句可以帮助我们编写更加灵活和强大的程序,实现各种复杂的功能和逻辑。希望本文对你有所帮助。

继续阅读