看看以下代码片段的 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
只是为了扩展一下贾汉的答案:
ForInit
和ForUpdate
必须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
所以,你可以在ForInit
和ForUpdate
中使用someMethod(b)
,但你不能使用b
。
您可以在语言规范中找到所有不同类型的StatementExpression
(示例是我的):
StatementExpression:
Assignment // b = true
PreIncrementExpression // ++i
PreDecrementExpression // --i
PostIncrementExpression // i++
PostDecrementExpression // i--
MethodInvocation // someMethod(b)
ClassInstanceCreationExpression // new Object()