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

Java 基本for循环缺少表达式的语法,java,c,for-loop,Java,C,For Loop,几天前,我与同事讨论了Java中的以下代码: for( ; ; ) { } 这里没什么特别的,只是一个无限循环 但我们想知道为什么这在语法上是正确的。如果你看一看,你会看到: for ( [ForInit] ; [Expression] ; [ForUpdate] ) Statement 我知道ForInit和ForUpdate可以省略。但至少我认为表达式是强制性的,就像在while循环中一样: while() {} // compile error, Expression is misse

几天前,我与同事讨论了Java中的以下代码:

for( ; ; ) { }
这里没什么特别的,只是一个无限循环

但我们想知道为什么这在语法上是正确的。如果你看一看,你会看到:

for ( [ForInit] ; [Expression] ; [ForUpdate] ) Statement
我知道
ForInit
ForUpdate
可以省略。但至少我认为
表达式
是强制性的,就像在while循环中一样:

while() {} // compile error, Expression is missed
那个么为什么在for循环中可以省略表达式呢?还有一个问题需要进一步思考——为什么遗漏的表达式被解析为
true
?我的期望是将空表达式解析为
false

同样的想法也适用于其他语言(我曾用C和JavaScript尝试过,但我相信每种使用for循环的语言都是这样做的)

为什么表达式子句在for循环(但在while循环)中不是必需的?为什么空表达式解析为
true
而不是
false

基本原理开始并持续到14.14.1.2,强调我的观点

如果
ForInit
部分不存在,则不采取任何操作

如果
表达式
不存在,或者它存在并且其计算结果(包括任何可能的取消装箱)为真,则执行包含的
语句

JLS允许空白>代码> FIN ,<代码>表达式和<代码> FUPDATE < /COD>语句,并且有条件处理它们的缺省,因此省略它们是可接受的。 不允许在

循环时使用
执行此操作

表达式必须具有类型
boolean
boolean
,否则会发生编译时错误

因此,规范不允许传递空白表达式,因为这将导致上述的编译时错误


如果你想寻找一个更具历史意义的原因


由于Java从C中获得了大量灵感(并且大部分是在C中实现的),所以Java的循环与C的循环行为类似是非常有意义的,这就是它们的行为方式:表达式在C的
for
语句中是可选的,而且在它的
while
语句中是强制性的。

如果你担心这一点,你手头的时间太多了:)有趣的是,
for(;;)
while(true)
ae被替换为只有一条
转到0
指令:P@tokamak让我开心的一天:D@WaleryStrauch-是的。这里也是。@JasonZ:这两个问题完全不同。这是关于词法结构的问题,而不是为什么一个语句使用特定的表达式编译,而另一个不使用。。。我也看到了JLS。但我的问题是‘为什么’是这样?’因为甲骨文这样说“是关于你能从这里继续下去的最好的事情。”。我写这个问题是因为我希望有人能给出比“因为甲骨文这么说”更好的答案。当然,我相信java使其与C保持一致。但这一决定的最初原因是什么?可能有一些历史原因,比如“以这种方式实现编译器更容易”或者“只是个错误——但出于兼容性的原因,之后并没有改变”。也许还有其他原因。。。我的问题旨在找出答案。@WaleryStrauch:我添加了另一个资源,但最终的答案仍然是“因为Oracle/Sun这么说”。有强有力的证据表明它是从C语言中获得灵感的,这是有道理的,但这一决定仍然是由最初的语言设计者做出的。