为什么我不能在Java中for循环的第三个参数中使用?:运算符?

2022-09-01 12:27:13

为什么以下代码给我一个错误?

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);
}

答案 1

这是因为循环在 Java 语言规范中是这样定义的。for

14.14.1 语句的基础

BasicForStatement:
    for ( ForInit ; Expression ; ForUpdate ) Statement

ForStatementNoShortIf:
    for ( ForInit ; Expression ; ForUpdate ) StatementNoShortIf

ForInit:
    StatementExpressionList
    LocalVariableDeclaration

ForUpdate:
    StatementExpressionList


StatementExpressionList:
    StatementExpression
    StatementExpressionList , StatementExpression

因此,它需要是一个或多个 s,并定义为:StatementExpressionStatementExpressionStatementExpression

14.8 表达式语句

StatementExpression:
    Assignment
    PreIncrementExpression
    PreDecrementExpression
    PostIncrementExpression
    PostDecrementExpression
    MethodInvocation
    ClassInstanceCreationExpression

0 <= n ? (i++) : (i--)不是这些,所以它不被接受。 是一个作业,所以它有效。i += ((0 <= n) ? 1 : -1)


答案 2

首先,我建议不要以这种方式编写代码。代码的目的是“如果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循环的第三个参数中使用运算符??:

循环具有 结构 。forfor ( initialization ; condition ; action )

表达式的用途是计算值。

语句的目的是执行操作。

有一些表达式在设计上既计算值又采取操作、、、等等。i++i += jnew foo()method()

使用任何其他既计算值又执行操作的表达式都是不好的样式。这样的表达是难以推理的。

因此,循环的操作被限制为仅那些通过设计既计算值又执行操作的表达式for

基本上,通过禁止此代码,编译器会告诉您,您做出了错误的样式选择。 是一种法律表达,但它确实是糟糕的风格,因为它使应该计算价值的东西产生了副作用并忽略了价值b?i++:i--