为什么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
稍微扩展一下 :
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
in the language spec(例子是我的):
StatementExpression:
Assignment // b = true
PreIncrementExpression // ++i
PreDecrementExpression // --i
PostIncrementExpression // i++
PostDecrementExpression // i--
MethodInvocation // someMethod(b)
ClassInstanceCreationExpression // new Object()
看看下面代码段的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
in the language spec(例子是我的):
StatementExpression:
Assignment // b = true
PreIncrementExpression // ++i
PreDecrementExpression // --i
PostIncrementExpression // i++
PostDecrementExpression // i--
MethodInvocation // someMethod(b)
ClassInstanceCreationExpression // new Object()