为什么我不能在Java中for循环的第三个参数中使用?:运算符?
为什么以下代码给我一个错误?
int n = 30000; // Some number
for (int i = 0;
0 <= n ? (i < n) : (i > n);
0 <= n ? (i++) : (i--)) { // ## Error "not a statement" ##
f(i,n);
}
为什么以下代码给我一个错误?
int n = 30000; // Some number
for (int i = 0;
0 <= n ? (i < n) : (i > n);
0 <= n ? (i++) : (i--)) { // ## Error "not a statement" ##
f(i,n);
}
这是因为循环在 Java 语言规范中是这样定义的。for
BasicForStatement:
for ( ForInit ; Expression ; ForUpdate ) Statement
ForStatementNoShortIf:
for ( ForInit ; Expression ; ForUpdate ) StatementNoShortIf
ForInit:
StatementExpressionList
LocalVariableDeclaration
ForUpdate:
StatementExpressionList
StatementExpressionList:
StatementExpression
StatementExpressionList , StatementExpression
因此,它需要是一个或多个 s,并定义为:StatementExpression
StatementExpression
StatementExpression
StatementExpression:
Assignment
PreIncrementExpression
PreDecrementExpression
PostIncrementExpression
PostDecrementExpression
MethodInvocation
ClassInstanceCreationExpression
0 <= n ? (i++) : (i--)
不是这些,所以它不被接受。 是一个作业,所以它有效。i += ((0 <= n) ? 1 : -1)
首先,我建议不要以这种方式编写代码。代码的目的是“如果n为正数,则从零到n计数,如果n为负数,则从0到n倒计时”,但我倾向于这样写:
for (int i = 0; i < abs(n); i += 1)
{
int argument = n < 0 ? -i : i;
f(argument, n);
}
但这并不能回答你的问题,即:
为什么我不能在Java中for循环的第三个参数中使用运算符?
?:
循环具有 结构 。for
for ( initialization ; condition ; action )
表达式的用途是计算值。
语句的目的是执行操作。
有一些表达式在设计上既计算值又采取操作、、、等等。i++
i += j
new foo()
method()
使用任何其他既计算值又执行操作的表达式都是不好的样式。这样的表达是难以推理的。
因此,循环的操作被限制为仅那些通过设计既计算值又执行操作的表达式。for
基本上,通过禁止此代码,编译器会告诉您,您做出了错误的样式选择。 是一种法律表达,但它确实是糟糕的风格,因为它使应该计算价值的东西产生了副作用并忽略了价值。b?i++:i--