【发布时间】:2016-05-21 05:05:18
【问题描述】:
几天前,我和我的同事讨论了这段 Java 代码:
for( ; ; ) { }
这里没什么特别的,只是一个无限循环。
但我们想知道为什么这在语法上是正确的。如果您查看JLS §14.14.1,您会看到:
for ( [ForInit] ; [Expression] ; [ForUpdate] ) Statement
我知道ForInit 和ForUpdate 可以省略。但至少我希望 Expression 是强制性的,就像在 while-loop 中一样:
while() {} // compile error, Expression is missed
那么为什么在 for 循环中可以省略 Expression?甚至有人想得更多——为什么错过的表达式解析为true?我的期望是空的表达式被解析为false。
同样的想法也适用于其他语言(我已经用 C 和 JavaScript 尝试过,但我相信每一种带有 for 循环的语言都会以这种方式运行)。
为什么表达式子句在 for 循环中不是强制性的(但在 while 循环中)?为什么空表达式解析为true 而不是false?
【问题讨论】:
-
如果你担心这个,你手头的时间太多了 :)
-
有趣的是,
for(;;)和while(true)ae 都只替换为一条goto 0指令:P -
@tokamak 成就了我的一天:D
-
@WaleryStrauch - 是的。这里也一样。
-
@JasonZ:这两个问题是天壤之别。这是在询问词法结构,not 为什么一条语句使用特定的表达式编译而另一条则没有。