在Java中,括号内和括号外的增量索引有什么区别?

时间:2018-10-23 18:21:52

标签: java arrays increment

我正在做一些练习,但遇到了一些我不太了解的事情。下面是代码和我不完全理解的部分,我将放在*this*之类的星星之间。

public int[] seriesUp(int n) {
  int[] result = new int[n * (n + 1) / 2];
  int i = 0;
  for (int j = 1; j <= n; ++j)
    for (int k = 1; k <= j; ++k)
      result[*i++*] = k;
  return result;
}

有人可以解释上下之间的区别吗?

public int[] seriesUp(int n) {
  int[] result = new int[n * (n + 1) / 2];
  int i = 0;
  for (int j = 1; j <= n; ++j)
    for (int k = 1; k <= j; ++k)
      result[i] = k;
      *i++;*
  return result;
}

我将索引括号中的i++更改为i,并增加了下面的i,但这给出了其他全部输出,即使在我看来也是一样。 / p>

1 个答案:

答案 0 :(得分:4)

TL; DR

for (int j = 1; j <= n; ++j)
  for (int k = 1; k <= j; ++k)
    result[i++] = k;

等效于下面的代码(用花括号格式化),它们在两个for循环中递增 i

for (int j = 1; j <= n; ++j) {
  for (int k = 1; k <= j; ++k) {
    result[i++] = k;
  }
}

还有这个

for (int j = 1; j <= n; ++j)
  for (int k = 1; k <= j; ++k)
    result[i] = k;
    i++;

等同于此代码(用花括号格式化),在两个for循环之后,递增 i 执行:

for (int j = 1; j <= n; ++j) {
  for (int k = 1; k <= j; ++k) {
    result[i] = k;
  }
}
i++;

基本上,当不使用花括号时,诸如forwhileif等的指令仅将下一行解释为要作为其一部分执行的代码块它的声明。

在您的情况下,您将result[i++] = k;(一行)替换为(两行)

result[i] = k;
i++

通过这种方式,将第二行(i++)从要由for执行的语句中删除。遵循相同的原理,外循环也忽略i++句子。

正确使用花括号和代码格式时,这永远不会发生。


长篇故事

这是for语句:

for ( [ForInit] ; [Expression] ; [ForUpdate] ) Statement

Statement可以(除其他外)是ExpressionStatementBlock

您通过ExpressionStatement使用的result[i++] = k;Assignment(其中两个,实际上是:result[i] = k;i = i + 1,但在一个行),即:

LeftHandSide AssignmentOperator Expression
result[i]    =                  k         ; // leaving out the `++` operation for simplicity here

现在,当您在不使用花括号的情况下更改为第二种选择时,Statement使用的for仍然是其旁边的第一行

result[i] = k; // <-- this keeps being the `Statement` taken by the `for`
i++            // and this line is not considered as a statement to be used by the for anymore

但是,如果您使用花括号,它将变成Block形式的声明

{ [BlockStatements] }

BlockStatements在哪里

BlockStatement {BlockStatement}

每个BlockStatement都可以是Statement。这样一来,您就可以放入希望由Assignment s语句执行的Statement个语句(记住这是一个for)。


其他读数