2015-03-02 52 views
7

編譯錯誤:賦值的左邊必須是一個變量爲什麼for循環不直接接受布爾值?

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

+6

你想做什麼?這沒有意義。 – Brandon 2015-03-02 05:38:37

+1

你的問題似乎建立在一個錯誤的前提上。編譯第一個樣本時,我沒有收到錯誤「賦值的左側必須是變量」;我收到「true」不是一個聲明的錯誤,這是完全正確的。 – 2015-03-02 05:42:02

+0

@blm重要嗎?這是一個有效的問題。 – Voldemort 2015-03-02 05:43:13

回答

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不是。

+0

很好的回答:-) – squiroid 2015-03-02 06:21:58

4

根據DOC

for (initialization; termination; 
    increment) { 
    statement(s) 
} 

而且intialization和增量必須表達(分配)不是簡單的布爾但在Java函數調用被視爲表達式,它會正確評估。