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

Java 为什么增强for循环在以分号结尾时不会失败?,java,for-loop,Java,For Loop,我正在学习Java认证,在一次模拟考试中,我看到了一个非常奇怪的for循环实现。该练习显示了以下语法: for (Days d: Days.values()); 一开始,我认为这是一个语法错误,因为我一直知道“for循环”的语法需要大括号,或者,如果只有一条指令需要迭代,我们可以跳过大括号,并在循环后将语句对齐。 --因为我以前从未见过以分号“;”结尾的For循环-- 然后,我试图找到一些关于它的文档,但不幸的是,我找不到任何解释为什么是一个法律代码声明。仅引用以下语法: The syntax

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

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

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

The syntax of enhanced for loop is:

for(declaration : expression)
{
   //Statements
}
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]);
    }

}
  • 有人知道为什么允许使用这种语法吗? 多谢各位

在Java中创建
for loop
增强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++);
如您所见,
语句
引用任何有效语句,其中包括
的用法,作为
是有效的“
语句”
”。因为这是允许的,所以在任何情况下都没有理由失败

实际上,另一种解释(inti=0;i<5;i++)的
将是:

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

同样的规则也适用于:

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

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

for (Integer i : ints);

for循环定义为:

  for ( ForControl ) Statement
是Java中的有效语句,也是语句块。这种形式的循环并不常见,但您可以执行以下操作:

 int i = 2;
 for(; i < 100; i*=2);
 // i is now the smallest power of two greater than 100
inti=2;
对于(;i<100;i*=2);
//我现在是两个大于100的最小幂

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

增强的
for
语句的形式为
for(声明:表达式)语句

这是因为不需要支架

一个分号形成一个所谓的uEmpty statement u,这使得代码片段在语法上有效

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

The syntax of enhanced for loop is:

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

for(declaration : expression)
{
   //Statements
}
引用您的问题的“文档”来自TutorialPoint上的一页(如我在2016年5月22日看到的)。我不打算链接到它,但假设他们还没有纠正它(还没有),你应该能够找到它使用谷歌短语搜索

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

TutorialsPoint没有地位。在这种情况下,他们只是把Java语法弄错了

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

其中
语句
语句noshortif
包括空语句;i、 e.一个空分号



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

A
for(Days d:Days.values())
与for(Days d:Days.values()){//nothing in the curlies}
相同,是一个空for语句。事实上,这很有意义,非常感谢您的解释。@B.demile谢谢。如果此答案解决了您的问题,请随意将其标记为已接受。我没有更新此答案,我无法投票,因为我还没有15点的声誉。“请解释否决票?”-不是我,但您的答案实际上没有回答问题
有人知道为什么允许使用这种语法吗?
-答案是OP依赖于>>incorrect@B.Demille-很明显,你头脑中问题的“要点”与你实际写的东西之间存在着显著的差异。