语法错误表达基本for循环

Wal*_*uch 8 c java for-loop

几天前,我在与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

Mak*_*oto 3

其基本原理从 JLS 14.14.1.1开始,一直延续到 14.14.1.2,重点是我的。

如果该ForInit部件不存在,则不采取任何操作。

如果Expression 不存在,或者存在并且其评估(包括任何可能的拆箱)产生的值为 true,则执行包含的Statement...

JLS 允许空白ForInit,ExpressionForUpdate语句,并且有条件处理它们的缺失,因此省略它们是可以接受的。

根据 JLS 14.12 不允许对while循环执行此操作。

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

由此看来,规范不允许传递空白表达式,因为这会导致上述编译时错误。


如果您正在寻找稍微更历史性的原因,C 规范也强制执行此操作

在此输入图像描述

由于 Java 从 C 中获得了大量灵感(并且主要在其中实现),因此 Java 循环的行为与 C 循环类似是完全合理的,这就是它们的行为方式:表达式在 C 的语句中是可选的,在其语句for 中是强制的while

  • 我写这个问题是因为我希望有人能有比“因为 Oracle 这么说”更好的答案。当然,我相信java使其与C保持一致。但是这个决定的最初原因是什么?也许存在历史原因,例如“以这种方式实现编译器更容易”或“只是错误 - 但出于兼容性原因,之后没有更改”。也许还有其他原因......我的问题旨在找出这一点。 (2认同)