[英]Syntax with missed Expression for basic for-loop
几天前,我正与同事讨论Java中的这段代码:
for( ; ; ) { }
这里没什么特别的,只是无限循环。
但是我们想知道为什么这在语法上是正确的。 如果查看JLS§14.14.1,您会看到以下内容:
for ( [ForInit] ; [Expression] ; [ForUpdate] ) Statement
我了解可以省略ForInit
和ForUpdate
。 但是至少我希望Expression
是强制性的,例如在while循环中:
while() {} // compile error, Expression is missed
那么为什么在for循环中可以省略Expression? 甚至有人想一想-为什么错过的Expression解析为true
? 我的期望是将空Expression解析为false
。
同样的想法也适用于其他语言(我已经在C和JavaScript中进行过尝试,但是我相信每种带有for循环的语言都以这种方式运行)。
为什么在for循环(而不是while循环)中Expression子句不是必需的? 为什么空表达式解析为true
而不是false
?
基本原理从JLS 14.14.1.1开始,一直持续到14.14.1.2,重点是我的。
如果不存在
ForInit
部分,则不执行任何操作。如果不存在
Expression
,或者存在Expression
且其求值(包括任何可能的取消装箱)的结果为true,则执行包含的Statement
...
JLS允许使用空白的ForInit
, Expression
和ForUpdate
语句,并具有处理它们不存在的条件,因此可以省略它们。
这是不允许有这样做的while
循环, 每JLS 14.12 。
Expression
必须具有boolean
或Boolean
类型,否则会发生编译时错误。
由此,本说明书中不允许空白表达通过传递,因为这将导致每个上述一个编译时间错误。
如果您正在寻找历史原因,则C规范也要求这样做 。
由于Java从C中获得了很大的启发(并且大部分是在C中实现的),因此Java循环的行为类似于C的循环是完全合理的,这就是它们的行为方式:表达式在C的for
语句中是可选的,而在while
强制性的声明。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.