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条)