1
第 5章 程序流程控制
5.1 操作运算语句
5.2 选择语句
5.3 循环语句
5.4 转移语句
5.5 预处理指令
2
5.1.1 终点与可达性
直观地说,语法上语句书写完成的地方就是该语句的终点。
如果一条语句可以被执行,则称它是可达的
( reachable);相反,如果一条语句无法被执行,我们称它是不可达的
( unreachable)。
3
5.1.2 函数调用语句
函数调用语句由函数调用加一个分号“;”
构成一条语句。
例如:
Console.WriteLine(“Hello World!”);
4
5.1.3 语句块
语句块也被称为复合语句,它是用一对花括号,{ }”括起的语句序列。
假如此语句序列被省略,则称块为空。
块可以嵌套。
5
5.1.4 空语句
空语句不进行任何操作。
一条空语句的执行只是简单地把控制跳到语句的结束点。
空语句可以被用在 while语句中,此时它含有一个空地执行体,
6
5.1.5 标号语句
一个标号语句允许一条语句前加上一个标号。
标号语句可以被用在语句块中,但不允许出现在嵌套语句中。
一个标号可以在它的作用域内通过 goto语句来引用,
执行一条标号语句时,就是执行标号后面的语句。
7
5.1.6 声明语句
声明语句可以声明一个局部变量或常量。
声明语句可以在语句块中出现,但是不允许在嵌套语句中出现。
1.局部变量声明
2.局部常量声明
8
5.1.7 表达式语句
表达式语句由一个表达式后接一个分号“;”
组成。
在 C#语言中,只有以下四类表达式可以成为表达式语句:
( 1) new对象创建表达式;
( 2)调用表达式;
( 3)赋值表达式;
( 4)自增、自减表达式。
返回目录
9
5.2.1 if语句
if语句是条件选择语句,其常用的表达形式有:
if(布尔表达式)
{ 语句组;
}

if(布尔表达式)
{ 语句组 1;
}
else
{ 语句组 2;
}
10
if语句的控制流程,
if 语句可以嵌套使用,每一条 else 与离它最近且没有其它 else与之对应的 if相搭配。
11
还可以使用 else-if方法处理多个条件:
if(布尔表达式 1)
{语句组 1; }
else if(布尔表达式 2)
{语句组 2; }
……
else if(布尔表达式 n)
{语句组 n; }
else
{语句组 n+1; }
12
5.2.2 switch语句switch(表达式)
{
case 常量表达式 1:
{语句组 1}
break;
case 常量表达式 2:
{语句组 2}
break;
……
case 常量表达式 n:
{语句组 n}
break;
default:
{语句组 n+1}
break;
}
13
在 C#中程序员必须显式地告诉编译器停止
switch语句的执行,这就要在 switch语句中每个执行单元后添加 break语句。当程序遇到 break语句时,switch语句终止执行,程序的控制转移到 switch语句后紧接的一条语句。
如果想让 C#像 C++那样,执行完某个 case
语句后能继续遍历其它的语句,则只需要明确地加入下面这两条跳转语句即可:
goto case label:跳至标签语句执行;
goto default:跳至 default 标签执行。
switch语句后面括号中的表达式类型可以是
string类型。
返回目录
14
5.3.1 while语句
while(布尔表达式)
{
循环体
}
使用 break语句结束 while
循环,执行后续语句;
使用 continue语句停止循环体的执行,继续进行
while 循环。
15
5.3.2 do-while语句
do
{
循环体
}
while(布尔表达式);
同样允许用 break语句和
continue语句
16
5.3.3 for语句
for(表达式 1;布尔表达式 2;表达式 3)
{
循环体
}
17
5.3.4 foreach语句
foreach(变量类型 循环变量 in 集合表达式)
{
循环体
}
18
1.对数组使用 foreach语句
foreach语句可用来为数组中的每一个元素执行一遍循环体中的语句。
因为不需要数组中的元素直接参与运算,也不需要事先知道数组元素的个数,所以对全体数组进行操作时用 foreach语句效率很高。
2.对集合使用 foreach语句若要循环访问集合,在 foreach语句中集合必须满足下列条件:
集合类型必须是 interface,class或 struct类型,还必须包括返回类型的 GetEnumerator的实例方法。
循环变量类型包含一个 Current属性(返回集合的当前元素)和 MoveNext()方法。
返回目录
19
5.4.1 break语句
break语句用于终止最内层的 while,do-while、
for和 switch语句的执行。
当程序遇到这一语句后,执行紧接在被终止执行的语句后面的语句。
其语法格式为:
break;
20
5.4.2 continue语句
当程序遇到这一语句后,停止当前进行的这次循环并把控制返回到当前循环的顶部,以便于进行下一次循环。
与 break语句不同的是,continue语句不是终止整个循环的执行,而仅仅终止当前这一次循环的执行。
其语法格式为:
continue;
21
5.4.3 goto语句
goto语句也能用来跳出循环和 switch语句。
它无条件地转移程序的执行控制,其转移目的地是一标号,因此要求标号与 goto语句处在同一个函数中。
其语法格式为:
goto 标号 ;
goto case 表达式 ;
goto default;
由于大量或随意使用 goto语句会使程序的流程无规律,程序的可读性降低,因此,目前该语句已经很少使用。
22
5.4.4 return语句
return语句将程序执行控制返回给该语句所在的函数成员的调用者。
其语法格式为:
return 表达式;
return语句的表达式是可选的。
不能在 finally块中使用 return语句。
返回目录
23
24
5.5.1 条件编译
C#的条件编译主要依靠预处理指令,#if、
#else,#elif和 #endif,这四条预处理指令主要有以下四种基本组合方式:
#if(判断条件) …#endif
#if(判断条件) …#else…#endif
#if(判断条件) …#elif (判断条件) …#endif
#if(判断条件) …#elif (判断条件) …
#else …#endif
25
C#语言使用 #define来定义符号,其一般的定义形式为:
#define 符号
与 #define相对应,#undef指令可以用来撤消定义的符号,其一般的定义形式为:
#undef 符号
#undef和 #define必须放在所有其他非注释语句和非预处理指令语句的前面。
26
5.5.2 报告编译错误和警告
#warning是以编译警告的形式输出字符串,
程序仍可被编译通过,其一般的使用格式为,
#warning 字符串
#error是以编译错误的形式输出字符串,此时程序无法被成功编译,其一般的使用格式为,
#error 字符串
#line指令允许改变编译器报告的错误或警告信息的内容,其一般的使用格式为,
#line 行号 ["文件名 "]
27
5.5.3 定义代码块指令
#region和 #endregion用来指定需要采用扩展或者压缩方式显示的代码段,一般的使用格式如下:
#region 字符串代码块
# endregion
#region和 #endregion要配对使用,#region标识代码块的头,#endregion标识代码块的尾。
返回目录