为什么for循环可以保存返回的布尔值而不是原始布尔值?

Why for loop can hold returned boolean value but not primitive boolean value?

看看下面代码段的for循环。

class Practice
{ 
    static boolean foo(char c){
        System.out.print(c); 
        return true; 
    } 
    public static void main( String[] args ){
        int i = 0; 
        for (foo('A'); foo('B') && (i < 2); foo('C')){
            i++; 
            foo('D'); 
        } 
    } 
}

这部分代码编译执行没有报错。即使它从函数

中获取布尔值
for (foo('A'); foo('B') && (i < 2); foo('C')){
     i++; 
     foo('D'); 
} 

虽然这是一个错误,

boolean b = true;

for (b;some_condition;b){

    //statements

}

// or,

for (true;some_condition;true){

    //statements

}

这是来自 Oracle 的 java 官方语法:

ForControl:
    ForVarControl
    ForInit ; [Expression] ; [ForUpdate]

ForVarControl:
    {VariableModifier} Type VariableDeclaratorId  ForVarControlRest

ForVarControlRest:
    ForVariableDeclaratorsRest ; [Expression] ; [ForUpdate]
    : Expression

ForVariableDeclaratorsRest:
    [= VariableInitializer] { , VariableDeclarator }

ForInit: 
ForUpdate:
    StatementExpression { , StatementExpression } 

据我了解,ForInit 和 ForUpdate 需要一个语句,而不是像 true 这样的文字值或像 b.

这样的表达式

https://docs.oracle.com/javase/specs/jls/se7/html/jls-18.html

稍微扩展一下 :

ForInitForUpdate 必须是 StatementExpressions.

一个StatementExpression是一个可以做成语句的表达式(具体来说,想象一下,StatementExpression ;被称为一个ExpressionStatement) .

并不是所有的表达式都是StatementExpressions:比如你不能这样写:

boolean b = true;
b;  // b is an expression, not a StatementExpression

这有点像喊一个词,“真的!” - 它本身没有任何意义:你必须用一些上下文来包围它,比如“Java 确实有 4 个字母”。

同样,4 + 3; 是不允许的,因为它不会“做”任何事情:7 只是...是。

不过,你可以这样写:

someMethod(b); // MethodInvocation is a StatementExpression

所以,你可以在ForInitForUpdate中使用someMethod(b),但不能使用b

你可以找到所有不同类型的 StatementExpression in the language spec(例子是我的):

StatementExpression:
  Assignment                         // b = true
  PreIncrementExpression             // ++i
  PreDecrementExpression             // --i
  PostIncrementExpression            // i++
  PostDecrementExpression            // i--
  MethodInvocation                   // someMethod(b)
  ClassInstanceCreationExpression    // new Object()