繁体   English   中英

基本for循环缺少表达式的语法

[英]Syntax with missed Expression for basic for-loop

几天前,我正与同事讨论Java中的这段代码:

for( ; ; ) { }

这里没什么特别的,只是无限循环。

但是我们想知道为什么这在语法上是正确的。 如果查看JLS§14.14.1,您会看到以下内容:

for ( [ForInit] ; [Expression] ; [ForUpdate] ) Statement

我了解可以省略ForInitForUpdate 但是至少我希望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允许使用空白的ForInitExpressionForUpdate语句,并具有处理它们不存在的条件,因此可以省略它们。

这是不允许有这样做的while循环, 每JLS 14.12

Expression必须具有booleanBoolean类型,否则会发生编译时错误。

由此,本说明书中允许空白表达通过传递,因为这将导致每个上述一个编译时间错误。


如果您正在寻找历史原因,则C规范也要求这样做

在此处输入图片说明

由于Java从C中获得了很大的启发(并且大部分是在C中实现的),因此Java循环的行为类似于C的循环是完全合理的,这就是它们的行为方式:表达式在C的for语句中是可选的,而在while强制性的声明。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM