CSharp 语言定义文档 - 8 语句详解

CSharp 语言定义文档 - 8 语句详解


2024年6月20日发(作者:)

章节 8 语句

8. 语句

C# 提供各种语句。使用过 C 和 C++ 编程的开发人员熟悉其中大多数语句。

statement:

labeled-statement

declaration-statement

embedded-statement

embedded-statement:

block

empty-statement

expression-statement

selection-statement

iteration-statement

jump-statement

try-statement

checked-statement

unchecked-statement

lock-statement

using-statement

yield-statement

embedded-statement 非终结符用于在其他语句内出现的语句。使用 embedded-statement(而非 statement)

便不需要在这些上下文中使用声明语句和标记语句。下面的示例

void F(bool b) {

if (b)

int i = 44;

}

将导致编译时错误,原因是

if

语句的 if 分支要求 embedded-statement 而不是 statement。若允许执行上

述代码,则声明了变量

i

,却永远无法使用它。但是请注意,如果是将

i

的声明放置在一个块中,则该

示例就是有效的。

8.1 结束点和可到达性

每个语句都有一个结束点 (end point)。直观地讲,语句的结束点是紧跟在语句后面的那个位置。复合语

句(包含嵌入语句的语句)的执行规则规定了当控制到达一个嵌入语句的结束点时所采取的操作。例

如,当控制到达块中某个语句的结束点时,控制就转到该块中的下一个语句。

如果执行流程可能到达某个语句,则称该语句是可到达的 (reachable)。相反,如果某个语句不可能被执

行,则称该语句是不可到达的 (unreachable)。

在下面的示例中

229

C# LANGUAGE SPECIFICATION

void F() {

ine("reachable");

goto Label;

ine("unreachable");

Label:

ine("reachable");

}

第二个

ine

调用是不可到达的,这是因为不可能执行该语句。

如果编译器确定某个语句是不可到达的,将会报出警告。准确地说,语句不可到达不算是错误。

为了确定某个特定的语句或结束点是否可到达,编译器根据为各语句定义的可到达性规则进行控制流分

析。控制流分析会考虑那些能控制语句行为的常量表达式(第 7.19 节)的值,但不考虑非常量表达式

的可能值。换句话说,出于控制流分析的目的,给定类型的非常量表达式被认为具有该类型的任何可能

值。

在下面的示例中

void F() {

const int i = 1;

if (i == 2) ine("unreachable");

}

if

语句的布尔表达式是常量表达式,原因是

==

运算符的两个操作数都是常量。由于该常量表达式在编

译时进行计算并产生值

false

,所以

ine

调用被认为是不可到达的。但是,如果

i

改为局部变量

void F() {

int i = 1;

if (i == 2) ine("reachable");

}

ine

调用被认为是可到达的,即使它实际上永远不会被执行。

函数成员的 block 始终被认为是可到达的。通过依次计算块中各语句的可到达性规则,可以确定任何给

定语句的可到达性。

在下面的示例中

void F(int x) {

ine("start");

if (x < 0) ine("negative");

}

第二个

ine

的可到达性按下面的规则确定:

• 第一个

ine

表达式语句是可到达的,原因是

F

方法块是可到达的。

• 第一个

ine

表达式语句的结束点是可到达的,原因是该语句是可到达的。

if

语句是可到达的,原因是第一个

ine

表达式语句的结束点是可到达的。

• 第二个

ine

表达式语句是可到达的,原因是

if

语句的布尔表达式没有常量值

false

在下列两种情况下,如果某个语句的结束点是可以到达的,则会出现编译时错误:

• 由于

switch

语句不允许一个 switch 节“贯穿”到下一个 switch 节,因此如果一个 switch 节的语句

列表的结束点是可到达的,则会出现编译时错误。如果发生此错误,则通常表明该处遗漏了一个

break

语句。


发布者:admin,转转请注明出处:http://www.yc00.com/web/1718830359a2752919.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信