我正在学习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]);
}
}
答案 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
其中Statement
和StatementNoShortIf
包含空语句;即一个裸露的分号。
1 - 语法规则引自Java 8语法。 “no short ifs”变体是关于消除嵌套if
语句的歧义,在此处不相关。在Java 7 JLS中,规范中有两个版本的语法,一个带有变体,另一个没有变体。
答案 2 :(得分:1)
您阅读的文档不是官方文档,因为作者会写:
增强型
for
语句的格式为for (declaration : expression) statement
这是因为不需要牙箍。
单个分号形成一个所谓的_ empty statement_,这使得您的代码段在语法上有效。
答案 3 :(得分:0)
在Java中可以使用3种主要的不同方式创建for-loop
或enhanced 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个循环相当于:
i
小于5时,请执行{}
之间的任何操作,并将其值增加1。i
小于5时,请打印i
并将其值增加一。i
小于5时,将其值增加一。这不是一个问题,“它为什么不失败”,更多的是,“循环被告知要做什么”。
具体而言,为什么它没有失败,是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);