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



看看以下代码片段的 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(示例是我的):

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

最新更新