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

时间:2016-05-22 05:02:17

标签: java for-loop

我正在学习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]);
    }

}
  • 有谁知道为什么允许这种语法? 谢谢。

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

  

请注意,在文档中仅提及以下语法:

The syntax of enhanced for loop is:

for(declaration : expression)
{
   //Statements
}

引用“文档”的问题来自TutorialsPoint上的一个页面(我在2016-05-22看到)。我不打算链接到它,但假设它们尚未纠正(尚未),您应该能够使用Google短语搜索找到它。

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

TutorialsPoint没有立足点。在这种情况下,他们只是让Java语法错误。

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

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

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

其中StatementStatementNoShortIf包含空语句;即一个裸露的分号。

1 - 语法规则引自Java 8语法。 “no short ifs”变体是关于消除嵌套if语句的歧义,在此处不相关。在Java 7 JLS中,规范中有两个版本的语法,一个带有变体,另一个没有变体。

答案 2 :(得分:1)

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

  

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

这是因为不需要牙箍。

单个分号形成一个所谓的_ empty statement_,这使得您的代码段在语法上有效。

答案 3 :(得分:0)

在Java中可以使用3种主要的不同方式创建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时,请执行{}之间的任何操作,并将其值增加1。
  2. 每次i小于5时,请打印i并将其值增加一。
  3. 每次i小于5时,将其值增加一。
  4. 这不是一个问题,“它为什么不失败”,更多的是,“循环被告知要做什么”。

    具体而言,为什么它没有失败,是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);