在Java';对于循环';递增器?

在Java';对于循环';递增器?,java,variables,loops,for-loop,declaration,Java,Variables,Loops,For Loop,Declaration,在学习OCP Java程序员考试时,我有点惊讶地发现这是一种合法的语法: for(int i = 0; i < 3; i++, System.out.print("howdy ")) ; 找不到有关此的详细信息。有人能提供一个参考或解释为什么在递增部分声明一个新变量不会编译,而其他语句(方法调用等)会编译吗?它只是(对于循环作用域)变量声明,还是此处不允许使用任何其他类型的语句?for循环的语法在JLS中定义: 许多语句都是有效的(请参阅alexei提供的链接),但您必须查看表达式的范围

在学习OCP Java程序员考试时,我有点惊讶地发现这是一种合法的语法:

for(int i = 0; i < 3; i++, System.out.print("howdy ")) ;

找不到有关此的详细信息。有人能提供一个参考或解释为什么在递增部分声明一个新变量不会编译,而其他语句(方法调用等)会编译吗?它只是(对于循环作用域)变量声明,还是此处不允许使用任何其他类型的语句?

for循环的语法在JLS中定义:


许多语句都是有效的(请参阅alexei提供的链接),但您必须查看表达式的范围,以了解为何初始化不起作用:


作用域覆盖for循环的所有迭代(而不是每次新的作用域)。第一部分只执行一次,但第二和第三部分在每个循环结束时执行。因此,如果将声明放在第三部分,它会被声明多次(这是不允许的)。

完整的解释可以在

摘录:

BasicForStatement:
    for ( ForInit_opt ; Expression_opt ; ForUpdate_opt ) Statement

ForInit:
    StatementExpressionList
    LocalVariableDeclaration

ForUpdate:
    StatementExpressionList

StatementExpressionList:
    StatementExpression
    StatementExpressionList , StatementExpression

所有三个“部分”都是可选的,ForInit和ForUpdate是表达式列表,其中每个语句都有一个逗号。

感谢您的参考!我没有完全意识到LocalVariableDeclaration不是StatementExpression(……但我现在意识到了!)
BasicForStatement:
    for ( ForInit_opt ; Expression_opt ; ForUpdate_opt ) Statement

ForInit:
    StatementExpressionList
    LocalVariableDeclaration

ForUpdate:
    StatementExpressionList

StatementExpressionList:
    StatementExpression
    StatementExpressionList , StatementExpression