为什么增强的for循环在以分号结尾时不会失败



我正在学习Java认证,在一次模拟考试中,我看到了for循环的一个非常奇怪的实现。该练习显示了以下语法:

for (Days d: Days.values());

一开始,我认为这是一个语法错误,因为我一直知道"for循环"的语法需要大括号,或者,如果只有一条指令要迭代,我们可以跳过大括号,并在循环后将语句对齐。--因为我以前从未见过以分号";"结尾的For循环。——

然后我试图找到一些关于它的文档,但不幸的是,我找不到任何解释为什么是法律代码声明。仅引用以下语法:

The syntax of enhanced for loop is:
for(declaration : expression)
{
//Statements
}

奇怪的是,在所有这些之后,我测试了我的代码,令人惊讶的是,它编译并运行得很好。然后,根据我所做的一些测试(玩代码),我发现";"的工作原理似乎像一个For循环,空的是大括号,所以,它之后的任何指令都只执行一次。(就好像代码在循环之外)。但我不确定这是否是对增强的for循环中分号的正确解释。

请参阅完整的示例:

package com.TestDays;
public class TestDays {
public enum Days { MON, TUE, WED};
public static void main(String[] args) {
int x = 0;
*for (Days d: Days.values());*
Days[] d2 = Days.values();
System.out.println(d2[2]);
}
}
  • 有人知道为什么允许这种语法吗?谢谢

https://docs.oracle.com/javase/specs/jls/se7/html/jls-18.html

for循环定义为:

for ( ForControl ) Statement

;是Java中的一个有效语句,也是一个语句块。这种形式的循环不是你经常看到的,但你可以做一些事情,比如:

int i = 2;
for(; i < 100; i*=2);
// i is now the smallest power of two greater than 100

请注意,在文档中只提到以下语法:

The syntax of enhanced for loop is:
for(declaration : expression)
{
//Statements
}

你的问题引用的"文档"来自TutorialsPoint上的一个页面(我在2016-05-22看到)。我不打算链接到它,但假设他们还没有纠正它,你应该可以使用谷歌短语搜索找到它。

这不是官方文件。Java的唯一官方文档是由Oracle(以及以前的Sun Microsystems)员工编写并由这些组织发布的文档。

教程Point没有立足之地。在这种情况下,他们只是弄错了Java语法。

根据Java 8 JLS,增强型for循环的真正Java语法是1

EnhancedForStatement:
for ( {VariableModifier} UnannType VariableDeclaratorId : Expression ) 
Statement
EnhancedForStatementNoShortIf:
for ( {VariableModifier} UnannType VariableDeclaratorId : Expression ) 
StatementNoShortIf

其中CCD_ 3和CCD_;即裸露的分号。


1-语法规则引用自Java 8语法。"no short if"变体是为了消除嵌套的if语句的歧义,与此无关。在Java7JLS中,规范中有两个语法版本,一个有变体,另一个没有变体

您阅读的文档不是官方文档,因为作者会写:

增强型for语句的形式为for (declaration : expression) statement

这是因为不需要大括号。

一个分号形成了一个所谓的"空语句",这使代码片段在语法上有效。

在Java中创建for-loopenhanced for-loop主要有三种不同的方法:

for (int i = 0; i < 5; i++) {
System.out.println(i);
}
for (int i = 0; i < 5; i++) System.out.println(i);
for (int i = 0; i < 5; i++);

这3个环路相当于:

  1. 每当i小于5时,执行{}之间的任何操作,并将其值增加一
  2. 每当i小于5时,打印i并将其值递增一
  3. 每当i小于5时,将其值增加一

这不是"为什么不失败"的问题,更重要的是"for循环被要求做什么"。

特别是,它为什么不失败,是for循环语法的布局方式。Stephen C的回答很好地解释了这一点:

根据Java 8 JLS,增强型for循环的真正Java语法是

EnhancedForStatement:
for ( {VariableModifier} UnannType VariableDeclaratorId : Expression ) 
Statement
EnhancedForStatementNoShortIf:
for ( {VariableModifier} UnannType VariableDeclaratorId : Expression ) 
StatementNoShortIf

如您所见,Statement指的是任何有效的语句,其中包括;的用法,因为;是有效的"Statement"。因为这是允许的,所以在任何情况下都没有理由失败。

事实上,解释for (int i = 0; i < 5; i++);的另一种方法是:

每当i小于5时,运行语句,并将其值递增一。

相同的规则可以应用于:

for (Integer i : ints) {
System.out.println(i);
}
for (Integer i : ints) System.out.println(i);
for (Integer i : ints);

相关内容

最新更新