Java 基本for循环缺少表达式的语法
几天前,我与同事讨论了Java中的以下代码: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
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语言中获得灵感的,这是有道理的,但这一决定仍然是由最初的语言设计者做出的。