为什么以下代码给我一个错误?
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);
}
Run Code Online (Sandbox Code Playgroud)
eis*_*eis 47
这是因为for循环已经在Java语言规范中以这种方式定义.
BasicForStatement:
for ( ForInit ; Expression ; ForUpdate ) Statement
ForStatementNoShortIf:
for ( ForInit ; Expression ; ForUpdate ) StatementNoShortIf
ForInit:
StatementExpressionList
LocalVariableDeclaration
ForUpdate:
StatementExpressionList
StatementExpressionList:
StatementExpression
StatementExpressionList , StatementExpression
Run Code Online (Sandbox Code Playgroud)
所以它需要是一个StatementExpression或多个StatementExpressions,并StatementExpression定义为:
StatementExpression:
Assignment
PreIncrementExpression
PreDecrementExpression
PostIncrementExpression
PostDecrementExpression
MethodInvocation
ClassInstanceCreationExpression
Run Code Online (Sandbox Code Playgroud)
0 <= n ? (i++) : (i--)不是那些,所以不被接受.i += ((0 <= n) ? 1 : -1)是一项任务,所以它有效.
Eri*_*ert 23
首先,我建议不要这样编写代码.代码的目的是"如果n为正,则从零计数到n,如果n为负,则从0倒数到n",但我倾向于写:
for (int i = 0; i < abs(n); i += 1)
{
int argument = n < 0 ? -i : i;
f(argument, n);
}
Run Code Online (Sandbox Code Playgroud)
但这不能回答你的问题,即:
为什么我不能
?:在Java的for循环的第三个参数中使用运算符?
甲for环具有结构for ( initialization ; condition ; action ).
表达式的目的是计算值.
声明的目的是采取行动.
有些表达式在设计时都会计算一个值并采取行动. i++,i += j,new foo(),method()等.
拥有任何其他表达式来计算值并采取行动是一种糟糕的风格.这样的表达很难推理.
因此,for循环的操作仅限于那些按设计计算值并采取操作的表达式.
基本上,通过禁止此代码,编译器告诉您,您已经做出了糟糕的风格选择.b?i++:i--是一个合法的表达,但它是非常糟糕的风格,因为它使计算一个值的东西产生副作用并忽略该值.
eth*_*far 17
更换
0 <= n ? (i++) : (i--)
Run Code Online (Sandbox Code Playgroud)
同
i += ((0 <= n) ? 1 : -1)
Run Code Online (Sandbox Code Playgroud)
应该工作