gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:54:22 26 4
gpt4 key购买 nike

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

for( ; ; ) { }

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

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

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

我明白 ForInitForUpdate 可以省略。但至少我希望 Expression 是强制性的,就像在 while 循环中一样:

while() {} // compile error, Expression is missed

那么为什么可以在 for 循环中省略 Expression?甚至还有更多思考 - 为什么 missing Expression 解析为 true?我的期望是空表达式被解析为 false

同样的想法对其他语言也有效(我已经用 C 和 JavaScript 尝试过,但我相信每一种带有 for 循环的语言都以这种方式表现)。

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

最佳答案

理始in JLS 14.14.1.1并继续到 14.14.1.2,强调我的。

If the ForInit part is not present, no action is taken.

If the Expression is not present, or it is present and the value resulting from its evaluation (including any possible unboxing) is true, then the contained Statement is executed...

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

不允许使用 while 循环这样做,per JLS 14.12 .

The Expression must have type boolean or Boolean, or a compile-time error occurs.

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


如果您正在寻找稍微更历史的原因,C specification mandates this as well .

enter image description here

由于 Java 从 C 中汲取了很多灵感(并且大部分都是在 C 中实现的),因此 Java 的循环与 C 的循环的行为非常相似,这就是它们的行为方式:表达式在 C 的 for< 中是可选的 语句,并且在其 while 语句中是强制性的。

关于java - 缺少基本 for 循环表达式的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35322100/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com