提问人:Aaron 提问时间:7/26/2012 最后编辑:Dave NewtonAaron 更新时间:7/26/2012 访问量:110
语句 S 立即包含语句 U 是什么意思?
What does it mean that statement S immediately contains statement U?
问:
程序的执行顺序由语句控制,这些语句是 执行效果,没有值。
某些语句包含其他语句作为其结构的一部分;此类其他 语句是语句的子语句。我们立即说这句话 S 如果没有语句 T 与 S 和 U 不同,则包含语句 U,使得 S 包含 T,T 包含 U。以同样的方式,一些语句包含 表达式作为其结构的一部分。
如果没有语句 T 与 S 和 U 不同,则语句 S 立即包含语句 U,这意味着什么?
答:
0赞
tskuzzy
7/26/2012
#1
将以下复合语句视为 S:
(a+b)+c
设 U 是 S 内部的语句。然后 S 立即包含语句 U。这是因为 S 中没有非平凡的语句 T,因此 T 包含 U。(a+b)
但是,如果我们有类似的东西
S: (a+(b+c))+d
那么我们可以让 T 是 。(a+(b+c))
评论
2赞
Code-Apprentice
7/26/2012
(a+b) 是一个表达式,而不是一个语句
0赞
tskuzzy
7/26/2012
@Code-Guru:是的,你是对的,我的意思是用更抽象的术语来说明它。
0赞
Aaron
7/26/2012
@tskuzzy您能更深入地解释一下吗?
0赞
Code-Apprentice
7/26/2012
#2
例如:
if (...) { // A
doSomething(); // B
if (...) { // C
doSomethingElse(); // D
}
}
标有字母的行是语句。语句 A 包含语句 B、C 和 D,仅立即包含 B 和 C。语句 C 立即包含语句 D。
评论
0赞
assylias
7/26/2012
从技术上讲,我不认为块是子语句(块被定义为),即 C 不是 A 的子语句。StatementWithoutTrailingSubstatement
0赞
Code-Apprentice
7/26/2012
@assylias C 应该引用 if 语句。为块添加 {} 可能会使此处的问题有点混淆。p.s. 我想我理解你的评论,但它读起来并不完全流畅。这是编辑错误吗?
0赞
assylias
7/26/2012
我的评论读起来像我需要一些睡眠;-)主要的一点是,从技术上讲,块不能有子语句,我认为你的例子不适用于这个特定问题的上下文。第二点是:我认为这并不重要。据我所知,“立即包含”的概念在整个 JLS 中只使用过一次......
0赞
Code-Apprentice
7/26/2012
@assylias 你的答案肯定比我的要清楚得多;-)
4赞
assylias
7/26/2012
#3
某些语句包含其他语句作为其结构的一部分;此类其他 语句是语句的子语句。
JLS #14.5 将语句定义为:
陈述:
- StatementWithoutTrailingSub语句
- LabeledStatement
- IfThen语句
- IfThenElse语句
- While语句
- For语句
因此,唯一可以包含子语句(= 可以包含其他语句)的语句是标签、if、else、while 和 for。
然后含义变得更加清晰 - 例如,如果 S、T 和 u 被定义为:
if(a == b) //S
if(c == d) //T
doSomething(); //U
语句 S 立即包含语句 T,而语句 T 立即包含语句 U。但 S 不会立即包含 U。
评论