Java—为什么我不能在for循环之外初始化变量的起始值?

Java—为什么我不能在for循环之外初始化变量的起始值?,java,for-loop,Java,For Loop,有什么原因不能在for循环外初始化变量的起始值吗?当我这样做时: public static void main(String[] args) { int userInt = 1; int ender = 10; for (userInt; userInt < ender; userInt++) { System.out.println(userInt); 我收到一个语法错误,指出需要为userInt分配一个值,即使我已经为它分配了一个

有什么原因不能在for循环外初始化变量的起始值吗?当我这样做时:

    public static void main(String[] args) {

    int userInt = 1;
    int ender = 10;

    for (userInt; userInt < ender; userInt++) {
        System.out.println(userInt);
我收到一个语法错误,指出需要为userInt分配一个值,即使我已经为它分配了一个值1。当我这样做时:

public static void main(String[] args) {

    int userInt;
    int ender = 10;

    for (userInt = 1; userInt < ender; userInt++) {
        System.out.println(userInt);

错误消失了。原因是什么?

Java for循环的通用语法如下:

for ( {initialization}; {exit condition}; {incrementor} ) code_block;
这意味着您不能只在块中写下变量名。如果要使用已定义的变量,只需让它emtpy即可

这应该适合您:

for (; userInt < ender; userInt++) {
        System.out.println(userInt);
}

Java for循环的通用语法如下所示:

for ( {initialization}; {exit condition}; {incrementor} ) code_block;
这意味着您不能只在块中写下变量名。如果要使用已定义的变量,只需让它emtpy即可

这应该适合您:

for (; userInt < ender; userInt++) {
        System.out.println(userInt);
}
问题是for语句需要一个表达式

根据报告:

然后:

BasicForStatement:
    for ( ForInitopt ; Expressionopt ; ForUpdateopt ) Statement

ForStatementNoShortIf:
    for ( ForInitopt ; Expressionopt ; ForUpdateopt ) StatementNoShortIf

ForInit:
    StatementExpressionList
    LocalVariableDeclaration

ForUpdate:
    StatementExpressionList

StatementExpressionList:
    StatementExpression
    StatementExpressionList , StatementExpression
正如您看到的basic for语句一样,第一个元素是可选的初始化,即语句或局部变量声明

该声明是以下声明之一:

StatementExpression:
    Assignment
    PreIncrementExpression
    PreDecrementExpression
    PostIncrementExpression
    PostDecrementExpression
    MethodInvocation
    ClassInstanceCreationExpression
在您的示例中,userInt=1是一个赋值,而只是userInt与StatementExpression列表中的任何元素都不匹配,这会导致编译错误。

问题在于for语句需要一个表达式

根据报告:

然后:

BasicForStatement:
    for ( ForInitopt ; Expressionopt ; ForUpdateopt ) Statement

ForStatementNoShortIf:
    for ( ForInitopt ; Expressionopt ; ForUpdateopt ) StatementNoShortIf

ForInit:
    StatementExpressionList
    LocalVariableDeclaration

ForUpdate:
    StatementExpressionList

StatementExpressionList:
    StatementExpression
    StatementExpressionList , StatementExpression
正如您看到的basic for语句一样,第一个元素是可选的初始化,即语句或局部变量声明

该声明是以下声明之一:

StatementExpression:
    Assignment
    PreIncrementExpression
    PreDecrementExpression
    PostIncrementExpression
    PostDecrementExpression
    MethodInvocation
    ClassInstanceCreationExpression

在您的示例中,userInt=1是一个赋值,而只是userInt与StatementExpression列表中的任何元素都不匹配,这会导致编译错误。

@TomFang:要回答您最初尝试失败的原因:这是因为userInt;不是有效语句,这是您在原始for循环中尝试计算的内容。任何内容都可以进入初始化块,不必初始化任何内容。正如@JasonC所说,只需要是一个有效的声明。这就是我的批评+1@TomFang:回答最初尝试失败的原因:这是因为userInt;不是有效语句,这是您在原始for循环中尝试计算的内容。任何内容都可以进入初始化块,不必初始化任何内容。正如@JasonC所说,只需要是一个有效的声明。这就是我的批评+1+1回答得很好。澄清一下,因为它没有显示挑刺:它也不匹配EnhancedForStatement或LocalVariableDeclaration。+1很好的答案。澄清一下,因为它没有显示:它也不匹配EnhancedForStatement或LocalVariableDeclaration。