3

来自Java 语言规范,第 14 章,块和语句

程序的执行顺序是由语句控制的,这些语句是为了执行它们的效果而执行的,并且没有值。

一些语句包含其他语句作为其结构的一部分;此类其他陈述是该陈述的子陈述。如果不存在不同于 S 和 U 的语句 T 使得 S 包含 T 并且 T 包含 U,则我们说语句 S 立即包含语句 U。以同样的方式,某些语句包含表达式作为其结构的一部分。

如果没有不同于 S 和 U 的语句 T 使得 S 包含 T 并且 T 包含 U,那么语句 S 立即包含语句 U 是什么意思?

4

3 回答 3

4

一些语句包含其他语句作为其结构的一部分;此类其他陈述是该陈述的子陈述。

JLS #14.5将语句定义为:

陈述:

  • StatementWithoutTrailing 子语句
  • 标签声明
  • IfThen 语句
  • IfThenElse 语句
  • While 语句
  • 声明

因此,唯一可以有子语句(= 可以包含其他语句)的语句是标签、if、else、while 和 for。

然后含义变得更加清晰 - 例如,如果将 S、T 和 U 定义为:

if(a == b) //S
    if(c == d) //T
        doSomething(); //U

语句 S 立即包含语句 T,而语句 T 立即包含语句 U。但 S 不立即包含 U。

于 2012-07-26T00:05:14.333 回答
0

考虑以下复合语句为 S:

(a+b)+c

令 U 为 S 中的语句(a+b)。那么 S 立即包含语句 U。这是因为在 S 中不存在非平凡语句 T 使得 T 包含 U。

但是,如果我们有类似的东西

S: (a+(b+c))+d

然后我们可以让 T 为(a+(b+c))

于 2012-07-25T23:40:04.870 回答
0

例如:

if (...) { // A
  doSomething();  // B

  if (...) {  // C
    doSomethingElse(); // D
  }
}

标有字母的行是语句。语句 A 包含语句 B、C 和 D,并且仅立即包含 B 和 C。语句 C 立即包含语句 D。

于 2012-07-25T23:41:15.853 回答