前言
:blush:大家好,我是writer桑,前面一章已经学习了 C# 中运算符的使用,那本章就开始学习 C# 程序中的常用语句吧,希望看完大家能够有所收获,感谢支持!
语句概念
程序的执行操作使用语句表示,常见的语句操作包括声明迭代、判断语句、调用方法,以及根据给定条件跳转到另一个代码块等。语句在程序中的执行顺序称为 "控制流" 或 "执行流", 也即程序根据语句执行着不同的操作。
1,迭代语句
迭代语句是反复执行的语句或语句块,直到满足某些条件为止,其中包括 for 语句、foreach 语句、do 语句和 while 语句 。使用迭代语句实现重复控制结构时,在迭代语句中的任何地方,都可以使用 break 语句跳出当前所在循环,或者使用 continue 语句进行循环的下一个迭代。
1.1 for 语句
for 语句内指定的条件判断为 true 时,for 语句会执行一次循环体的内容,直到条件判断为 false 时会结束循环。实现一个小于5的计数器例子,借此来讨论 for 语句的语法。
示例如下:
for (int i = 0; i < 5;i++) // 初始化表达式;条件判断;迭代部分
{
Console.WriteLine(i); // 循环体的声明
}
上述示例展示了 for 语句的构成部分:
- "初始化表达式" 部分仅在进入循环前执行一次。通常在该部分中声明并初始化局部循环变量,但不能从 for 语句外部访问声明的变量。
上例中的"初始化表达式"部分声明并初始化了 int 类型的变量 i :
int i = 0;
- "条件判断" 部分是用来确定是否应执行循环中的下一个迭代。如果判断结果为 true 或为 null, 则执行下一个迭代,否则退出循环。注意条件判断部分必须为布尔表达式。
上例中的"条件判断"部分表示判断变量 i 是否小于 5:
i < 5;
- "迭代部分" 是在循环体每次执行完后再执行的操作。
上例中的"迭代部分"使用增量运算符表示每次执行完变量 i 加1:
i++
- "循环体"部分是 for 语句每次循环需要执行的内容,同时"循环体"部分必须是一个语句或代码块。
上例中的"循环体"部分在每次循环中输出变量 i:
Console.WriteLine(i);
for 语句流程图:
注意,for 语句的所有部分都是可选的, 可以在 for 语句的外部声明上述的三个部分,但是如果缺少部分声明可能会造成无限 for 循环。
示例如下:
// 报错,省略初始化部分
for(; i < 5; i++)
{
Console.WriteLine(i);
}
// 死循环,省略条件判断部分
for (int j = 1; ; j++)
{
Console.WriteLine(j);
}
// 死循环,省略迭代部分
for (int k = 1; k < 5;)
{
Console.WriteLine(k);
}
// 三个部分都省略
for (; ; )
{
// 死循环...
}
1.2 foreach 语句
foreach 语句用于列举出迭代对象中所有的元素,foreach 语句中的表达式由关键字 in 隔开的两个项组成。in 右边的项是可迭代对象,in 左边的项是只读变量,用来存放该集合中的每个元素。 借一个简单的示例讨论 foreach 语句的语法。
示例如下:
// 可迭代对象 fibNumbers
var fibNumbers = new List<int> { 0, 1, 1, 2, 3, 5, 8, 13 };
foreach (int element in fibNumbers) // 只读变量 element
{
Console.Write($"{element} "); // 循环体
}
// 输出:
// 0 1 1 2 3 5 8 13
上述示例展示了 foreach 语句的构成部分:
- "可迭代对象" 也就是可以被 foreach 语句迭代的对象,当一个对象实现了 GetEnumerator 方法且具有公共 Current 属性和公共无参数 MoveNext 方法时,这个对象就可以被 foreach 语句迭代。
上例中的"可迭代对象"声明了一个 List 类型的元素 fibNumbers,并存放了一些数字元素:
var fibNumbers = new List<int> { 0, 1, 1, 2, 3, 5, 8, 13 };
- "只读变量"是在循环中接收迭代对象中的元素,可迭代对象中的每个元素都会依次赋值给只读变量。可以在循环体中对只读变量进行操作。
上例中的"迭代元素"声明了一个 int 类型的变量 element :
int element in fibNumbers
- "循环体"部分是 foreach 语句每次循环需要执行的内容,同时"循环体"部分必须是一个语句或代码块。
上例中的"循环体"部分在每次循环中输出变量 element:
Console.Write($"{element} "); // 循环体
foreach 语句流程图:
1.3 while 语句
while 语句是当指定的布尔表达式的计算结果为 true 时,while 语句就会执行一条语句或一个语句块。 由于在每次执行循环之前都会计算布尔表达式, 所以 while 循环会执行零次或多次。借一个例子讨论 while 语句的语法。
示例如下:
int n = 0;
while (n < 5)
{
Console.WriteLine(n); // 循环体
n++;
}
// 输出:
// 01234
上述示例展示了 while 语句的构成部分:
- "布尔表达式"部分是 while 语句每次循环执行之前需要计算的结果,若结果为 true 则执行循环体,反之则退出循环。
上例中的"布尔表达式"声明了 int 类型的变量 n 并判断是否小于5:
while (n < 5)
- "循环体"部分是 while 语句每次循环需要执行的语句内容,同时"循环体"部分必须是一个语句或代码块。
上例中的"循环体"部分在每次循环中输出整数变量 n,并令 n 自增:
Console.WriteLine(n); // 循环体
n++;
while 语句流程图:
1.4 do 语句
do 语句会先执行一次循环体中的语句,再判断 while 语句中布尔表达式是否为真, 如果条件判断为真则继续循环,反之则终止循环。 由于在每次执行循环之后都会计算布尔表达式,所以 do 循环会执行一次或多次,注意不同于 while 循环是执行零次或多次。 借一个简单的例子讨论 do 语句的语法。
示 例:
int n = 0; // 声明整数 n
do
{
Console.Write(n); // 循环体
n++;
} while (n < 5); // while 条件判断式
// 输出:
// 01234
上述示例展示了 do 语句的构成部分:
- "循环体"部分跟 while 语句一样, 表示每次判断为 true 时需要执行的语句,同时"循环体"部分必须是一个语句或代码块。
上例中的"循环体"部分在每次循环中输出整数变量 n,并令 n 自增:
Console.Write(n); // 循环体
n++;
- do 语句的"布尔表达式"部分与 while 语句没有区别。表示 while 语句每次循环执行之前需要计算的结果,若结果为 true 则执行循环体,反之则结束循环。
上例中的"布尔表达式"声明了 int 类型的变量 n 并判断是否小于5:
while (n < 5);
do 语句流程图:
2,选择语句
选择语句是根据表达式的值从许多可能的路径中选择要执行的语句,其中包括 if 、else 和 switch 语句。 if 语句可与 else 结合使用,基于布尔表达式选择不同的路径。语句 switch 根据与表达式的模式匹配要执行的语句列表。
2.1,if 语句
if 语句由一个布尔表达式和一个或多个语句组成。 if 语句是在布尔表达式计算结果为 true 时执行指定的语句部分,计算结果为 false 时则语句结束。借一个示例来讨论 if 语句的语法。
示例如下:
int value = 100;
if (value < 0 || value > 100)
{
Console.Write($"{value}小于0或者大于100");
}
if 语句的构成部分:
- "布尔表达式"计算结果为 true 则执行指定的语句,计算结果为 false 则什么都不执行。
上例中的布尔表达式声明了 int 类型变量 value 是否小于0或大于 100:
(value < 0 || value > 100)
- if 语句的执行部分由一个或多个语句构成,仅在布尔表达式计算结果为 true 时执行。
上例中的语句执行部分将输出 value 变量:
Console.Write($"{value}小于0或者大于100");
if 语句的流程图:
2.2,else 语句
else 语句与 if 语句搭配,else 语句在 if 语句的布尔表达式计算结果为 false 时执行。 借一个示例来讨论 else 语句的语法。
示例如下:
int number = 20;
if (number < 20) // 结果为 true 时执行
{
Console.WriteLine("number小于20");
}
else // 结果为 false 时执行
{
Console.WriteLine("number大于等于20");
}
else 语句的构成部分:
- 当 if 语句的布尔表达式为 false 时执行 else 中的一个或多个语句的执行部分。
上例中的 else 语句的执行部分输出 number 变量大于等于20的提示信息:
Console.WriteLine("number大于等于20");
if...else 语句的流程图:
2.3,switch 语句
当 switch 语句根据给定的表达式参数与 case 关键字声明的匹配表达式匹配时,对应的匹配模式会执行指定的一个或多个语句的执行部分。以一个示例来说明 switch 语句的语法。
示例如下:
double measurement = 1.1; // 声明测量值
switch (measurement) // switch(表达式参数)
{
// case 匹配表达式
case < 0.0:
Console.WriteLine($"测量值为{measurement},太低了");
break;
case > 15.0:
Console.WriteLine($"测量值为{measurement},太高了");
break;
case double.NaN:
Console.WriteLine("失败的测量值。");
break;
default: // 默认部分
Console.WriteLine($"测量值为{measurement}.");
break;
}
switch 语句的构成部分:
- 参数表达式部分必须是一个整型或枚举类型,又或者是可以转换为整型或枚举类型的 class 类型。 参数用于与 switch 语句内的 case 语句匹配。
上例的参数表达式部分声明了一个 double 类型的变量 measurement:
double measurement = 1.1; // 声明测量值
switch (measurement) // switch(表达式参数)
- 匹配表达式部分表示一个匹配的条件,使用 case 关键字声明。switch 语句可以有多个 case 语句,当匹配表达式布尔值为 true 时则执行对应的语句部分,若布尔值为 false 时则直接执行下一个匹配部分直到 switch 语句结束。
上例的匹配表达式部分声明了三个 case 语句:
// case 匹配表达式
case < 0.0:
//...
case > 15.0:
//...
case double.NaN:
//...
- "执行语句"部分即匹配结果为 true 时执行的语句,注意 C# 不支持从一个 case 标签显式贯穿到另一个 case 标签, 所以在 case 执行语句不为空的情况下需要声明 break 或其它跳转语句。
上例中的执行语句部分输出了 measurement 变量的提示信息和 break 语句 :
case < 0.0:
Console.WriteLine($"测量值为{measurement},太低了");
break;
case > 15.0:
Console.WriteLine($"测量值为{measurement},太高了");
break;
case double.NaN:
Console.WriteLine("失败的测量值。");
break;
- default 语句是在 switch 语句末尾声明的一个可选的语句,表示在上面所有的 case 匹配结果都不为 true 时执行的语句。 当 switch 语句中的 case 匹配结果都不为 true 且没有 default 语句的时候会直接结束 switch语句。
上例中的 default 语句的执行部分输出 measurement 变量的提示信息和 break 语句:
Console.WriteLine($"测量值为{measurement}.");
break;
switch 语句的流程图:
3,跳转语句
跳转语句表示可以中断当前程序流,并从一个程序点跳转到另外一个程序点继续执行程序。C# 支持的跳转语句包括 break 语句、continue 语句、return 语句和 goto 语句。
3.1 break 语句
break 语句是将终止当前所在的迭代语句。包括上面所讲到的 for、foreach、while 或 do 语句以及 switch 语句。break 语句可以直接停止迭代语句的执行,并把执行权给后面的程序或者直接结束程序。 以一个示例来演示 break 语句的语法。
示例如下:
int[] numbers = { 1, 2, 3, 4, 5, 6 };
foreach(int number in numbers)
{
if(number == 3)
{
break; // 跳出当前 foreach 语句
}
Console.WriteLine($"{number}");
}
// 输出:
// 1
// 2
break 语句的流程图:
3.2 continue 语句
continue 语句与 break 语句不同的是 continue 语句只跳过当前循环直接进入下一次循环,而 break 语句是跳出整个循环。 continue 语句常用于 while 循环和 for 循环中。 以一个示例来演示 continue 语句的语法。
示例如下:
for (int i = 0; i < 5; i++)
{
Console.Write($"Iteration {i}: ");
if (i < 3)
{
Console.WriteLine("skip");
continue;
}
Console.WriteLine("done");
}
// 输出:
// Iteration 0: skip
// Iteration 1: skip
// Iteration 2: skip
// Iteration 3: done
// Iteration 4: done
continue 语句的流程图:
3.3 goto 语句
goto 语句将控制权转交给带有标签的语句,实现程序从一个点跳转到另外一个程序点执行。 以一个示例来理解 goto 语句。
示例如下:
// 局部变量定义
int a = 10;
LOOP: do
{
if (a == 15)
{
// 直接跳过迭代
a++;
goto LOOP;
}
Console.WriteLine($"a 的值:{a}");
a++;
} while (a < 20);
// 输出:
/*
a 的值:10
a 的值:11
a 的值:12
a 的值:13
a 的值:14
a 的值:16
a 的值:17
a 的值:18
a 的值:19
*/
注意无论什么编程语言,都不建议使用 goto 语句。因为 goto 语句使得程序的控制流难以跟踪,使程序难以理解和难以修改。而且任何使用 goto 语句的程序可以改写成不需要使用 goto 语句的写法。(示例中的功能可以使用 continue 语句实现)
goto 语句的流程图:
3.4 return 语句
return 语句的执行表示函数的结束,并将控制权和函数结果(若有)返回给函数的调用方,在 C# 中 return 语句的返回值的类型必须和函数的返回类型相同 。return 语句是函数的一个可选项,函数中不是一定要有 return 语句。如果函数成员不计算值,则使用不带表达式的 return 语句。 以一个示例来理解 return 语句。
示例如下:
Console.WriteLine("First call:");
DisplayIfNecessary(6);
Console.WriteLine("Second call:");
DisplayIfNecessary(5);
void DisplayIfNecessary(int number)
{
if (number % 2 == 0)
{
return;
}
Console.WriteLine(number);
}
// 输出:
//First call:
//Second call:
//5
结语
:grinning:以上就是 C# 常用语句的介绍,希望能够对大家有所帮助。望大家多多支持,你们的支持就是笔者创作最大的动力!