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

Java 为什么for循环可以保存返回的布尔值而不能保存原始布尔值?,java,for-loop,boolean,Java,For Loop,Boolean,看看下面代码片段的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('

看看下面代码片段的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'); 
        } 
    } 
}

这是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
这样的表达式


这是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
这样的表达式


仅对以下内容进行一点扩展:

ForInit
ForUpdate
必须是
语句表达式

StatementExpression
是一种可以生成语句的表达式(具体地说,想象一下,
StatementExpression;
称为
ExpressionStatement

并非所有表达式都是语句表达式:例如,您不能编写以下内容:

boolean b = true;
b;  // b is an expression, not a StatementExpression
someMethod(b); // MethodInvocation is a StatementExpression
这有点像喊出一个词“true!”——它本身没有任何意义:你必须用一些上下文来围绕它,比如“Java有4个字母,这是真的”

类似地,
4+3是不允许的,因为它不“做”任何事情:7只是。。。是

但是,您可以这样写:

boolean b = true;
b;  // b is an expression, not a StatementExpression
someMethod(b); // MethodInvocation is a StatementExpression
因此,您可以在
ForInit
ForUpdate
中使用
someMethod(b)
,但不能使用
b

你可以找到所有不同类型的
语句expression
(我举了一些例子):


只需对以下内容进行一点扩展:

ForInit
ForUpdate
必须是
语句表达式

StatementExpression
是一种可以生成语句的表达式(具体地说,想象一下,
StatementExpression;
称为
ExpressionStatement

并非所有表达式都是语句表达式:例如,您不能编写以下内容:

boolean b = true;
b;  // b is an expression, not a StatementExpression
someMethod(b); // MethodInvocation is a StatementExpression
这有点像喊出一个词“true!”——它本身没有任何意义:你必须用一些上下文来围绕它,比如“Java有4个字母,这是真的”

类似地,
4+3是不允许的,因为它不“做”任何事情:7只是。。。是

但是,您可以这样写:

boolean b = true;
b;  // b is an expression, not a StatementExpression
someMethod(b); // MethodInvocation is a StatementExpression
因此,您可以在
ForInit
ForUpdate
中使用
someMethod(b)
,但不能使用
b

你可以找到所有不同类型的
语句expression
(我举了一些例子):


假设您的代码类似于
booleanb=true;B是的。你期望什么
b或<代码>真如何实现?它什么也不做/它不影响任何东西-这就是为什么它被认为是程序员的错误(就像死代码一样),编译器会告诉我们。使用
foo(…)
应用程序的状态可能会发生一些变化;B是的。你期望什么
b或<代码>真如何实现?它什么也不做/它不影响任何东西-这就是为什么它被认为是程序员的错误(就像死代码一样),编译器会告诉我们。使用
foo(…)
应用程序状态可能会发生一些变化。