Java 为什么增强for循环在以分号结尾时不会失败?
我正在学习Java认证,在一次模拟考试中,我看到了一个非常奇怪的for循环实现。该练习显示了以下语法:Java 为什么增强for循环在以分号结尾时不会失败?,java,for-loop,Java,For Loop,我正在学习Java认证,在一次模拟考试中,我看到了一个非常奇怪的for循环实现。该练习显示了以下语法: for (Days d: Days.values()); 一开始,我认为这是一个语法错误,因为我一直知道“for循环”的语法需要大括号,或者,如果只有一条指令需要迭代,我们可以跳过大括号,并在循环后将语句对齐。 --因为我以前从未见过以分号“;”结尾的For循环-- 然后,我试图找到一些关于它的文档,但不幸的是,我找不到任何解释为什么是一个法律代码声明。仅引用以下语法: The syntax
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]);
}
}
- 有人知道为什么允许使用这种语法吗? 多谢各位
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中,规范中有两个语法版本,一个有变体,一个没有变体。Afor(Days d:Days.values())
与for(Days d:Days.values()){//nothing in the curlies}
相同,是一个空for语句。事实上,这很有意义,非常感谢您的解释。@B.demile谢谢。如果此答案解决了您的问题,请随意将其标记为已接受。我没有更新此答案,我无法投票,因为我还没有15点的声誉。“请解释否决票?”-不是我,但您的答案实际上没有回答问题有人知道为什么允许使用这种语法吗?
-答案是OP依赖于>>incorrect@B.Demille-很明显,你头脑中问题的“要点”与你实际写的东西之间存在着显著的差异。