为什么for循环不直接接受布尔值?

时间:2015-03-02 05:37:22

标签: java

编译错误:作业的左侧必须是变量

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循环不直接接受布尔值?

2 个答案:

答案 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函数中,调用被视为表达式,因此它将正确计算。