编译错误:作业的左侧必须是变量
class A {
public static void main(String[] args) {
for(true;true;true) {//compilation error
}
}
}
但是当我尝试这种方式时,没有编译错误
class A {
public static void main(String[] args) {
for (getBoolean(); true; getBoolean()) {
}
}
public static boolean getBoolean() {
return true;
}
}
getBoolean()返回一个布尔值,所以对于第一种情况,为什么for循环不直接接受布尔值?
答案 0 :(得分:14)
来自JLS:
BasicForStatement:
for ( ForInitopt ; Expressionopt ; ForUpdateopt ) Statement
ForStatementNoShortIf:
for ( ForInitopt ; Expressionopt ; ForUpdateopt ) StatementNoShortIf
ForInit:
StatementExpressionList
LocalVariableDeclaration
ForUpdate:
StatementExpressionList
StatementExpressionList:
StatementExpression
StatementExpressionList , StatementExpression
Then:
StatementExpression:
Assignment
PreIncrementExpression
PreDecrementExpression
PostIncrementExpression
PostDecrementExpression
MethodInvocation
ClassInstanceCreationExpression
如您所见,Method Invocation
是允许的,literal value
不是。
答案 1 :(得分:4)
根据文件
for (initialization; termination;
increment) {
statement(s)
}
初始化和增量必须是表达式(赋值)而不是简单的布尔值,但在java函数中,调用被视为表达式,因此它将正确计算。