几天前,我在与Java同事讨论这段代码:
for( ; ; ) { }
Run Code Online (Sandbox Code Playgroud)
这里没什么特别的,只是一个无限循环.
但我们想知道为什么这在语法上是正确的.如果您看一下JLS§14.14.1,您会看到:
for ( [ForInit] ; [Expression] ; [ForUpdate] ) Statement
Run Code Online (Sandbox Code Playgroud)
我理解ForInit并且ForUpdate可以省略.但至少我希望这Expression是强制性的,比如while循环:
while() {} // compile error, Expression is missed
Run Code Online (Sandbox Code Playgroud)
那么为什么可以在for循环中省略Expression呢?甚至一个人想得更多 - 为什么错过表达式解决了true?我的期望是将空表达式解析为false.
同样的想法对其他语言也有效(我用C和JavaScript尝试它,但我相信每个带有for循环的语言都是这样的).
为什么在for循环中(但在while循环中)Expression子句不是必需的?为什么空表达式解析true而不是false?
其基本原理从 JLS 14.14.1.1开始,一直延续到 14.14.1.2,重点是我的。
如果该
ForInit部件不存在,则不采取任何操作。如果
Expression不存在,或者存在并且其评估(包括任何可能的拆箱)产生的值为 true,则执行包含的Statement...
JLS 允许空白ForInit,Expression和ForUpdate语句,并且有条件处理它们的缺失,因此省略它们是可以接受的。
根据 JLS 14.12 ,不允许对while循环执行此操作。
必须
Expression具有类型boolean或Boolean,否则会发生编译时错误。
由此看来,规范不允许传递空白表达式,因为这会导致上述编译时错误。
如果您正在寻找稍微更历史性的原因,C 规范也强制执行此操作。
由于 Java 从 C 中获得了大量灵感(并且主要在其中实现),因此 Java 循环的行为与 C 循环类似是完全合理的,这就是它们的行为方式:表达式在 C 的语句中是可选的,在其语句for 中是强制的while。
| 归档时间: |
|
| 查看次数: |
100 次 |
| 最近记录: |