为什么以下代码会运行?

时间:2014-02-19 05:30:22

标签: java for-loop

请考虑以下代码:

int x = 0;   
for(System.out.println("Confuse!"); Math.random()>0.5; x--)
{
}

我对这段代码的编译方式感到很困惑(它实际上打印了#34; Confuse!")。这背后的解释是什么?是不是在for循环中我们有(启动;条件;增量)?我们不应该在那里定义一个int变量吗?或者这不重要,启动可以是什么?

1 个答案:

答案 0 :(得分:3)

for循环中的1 st 部分是初始化部分这一事实并不限制您只有初始化表达式。你可以在那里有任何有效的表达。例如,你甚至可以在那里给出一个增量表达式,如下例所示:

int i = 0;
for (++i; i < 10; i++) {
}

1 st 部分仅执行一次。它可以将i初始化为0。但我们已经在外面做过了。我们刚刚i增加了1

有关详细信息,请参阅JLS §14.14.1 - Basic for statement

BasicForStatement:
    for ( ForInitopt ; Expressionopt ; ForUpdateopt ) Statement

ForStatementNoShortIf:
    for ( ForInitopt ; Expressionopt ; ForUpdateopt ) StatementNoShortIf

ForInit:
    StatementExpressionList
    LocalVariableDeclaration

ForUpdate:
    StatementExpressionList

StatementExpressionList:
    StatementExpression
    StatementExpressionList , StatementExpression

根据规定,ForInit部分可以是有效表达式 本地变量声明的列表。你不能两者兼得。方法调用是一个有效的表达式,因此它是完全有效的语法。见JLS §14.8 - Expression Statements

这是一个更令人困惑的例子,表示表达式列表:

for (System.out.println("World"),System.out.println("Hello"); i < 10; i++) { }

您是否注意到2个打印语句由逗号分隔?这是一个有效的for声明。它会打印"World",然后是"Hello"

现在,您可以尝试同时放置局部变量声明,打印语句或增量语句,您将看到它失败。