请考虑以下代码:
int x = 0;
for(System.out.println("Confuse!"); Math.random()>0.5; x--)
{
}
我对这段代码的编译方式感到很困惑(它实际上打印了#34; Confuse!")。这背后的解释是什么?是不是在for循环中我们有(启动;条件;增量)?我们不应该在那里定义一个int变量吗?或者这不重要,启动可以是什么?
答案 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"
。
现在,您可以尝试同时放置局部变量声明,打印语句或增量语句,您将看到它失败。