首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java中括号内的增量索引和括号外的增量索引有什么区别?

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

Stack Overflow用户
提问于 2018-10-24 02:21:52
回答 1查看 380关注 0票数 2

我正在做一些练习,我遇到了一些我不太了解的东西。下面是一个代码和我不完全理解的部分,我将把它放在星号之间,比如*this*

代码语言:javascript
复制
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;
}

有人能解释一下上面和下面的区别是什么吗?

代码语言:javascript
复制
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,但这给出了一个完全不同的输出,尽管在我看来它是相同的。

EN

回答 1

Stack Overflow用户

发布于 2018-10-24 02:44:50

TL;DR

代码语言:javascript
复制
for (int j = 1; j <= n; ++j)
  for (int k = 1; k <= j; ++k)
    result[i++] = k;

等同于下面的代码(用大括号格式化),它在两个循环中递增 i循环:

代码语言:javascript
复制
for (int j = 1; j <= n; ++j) {
  for (int k = 1; k <= j; ++k) {
    result[i++] = k;
  }
}

还有这个

代码语言:javascript
复制
for (int j = 1; j <= n; ++j)
  for (int k = 1; k <= j; ++k)
    result[i] = k;
    i++;

等同于下面的代码(用大括号格式化),它在执行两个循环之后递增 i循环:

代码语言:javascript
复制
for (int j = 1; j <= n; ++j) {
  for (int k = 1; k <= j; ++k) {
    result[i] = k;
  }
}
i++;

基本上,当不使用大括号时,forwhileif等指令只将下一行解释为要作为其语句的一部分执行的代码块。

在本例中,您将result[i++] = k; (一行)替换为(两行)

代码语言:javascript
复制
result[i] = k;
i++

这样,将由for执行的语句中的第二行(i++)。遵循同样的原则,外部循环也会忽略i++语句。

当正确使用花括号和代码格式时,应该不会发生这种情况。

长篇大论

这是for语句:

代码语言:javascript
复制
for ( [ForInit] ; [Expression] ; [ForUpdate] ) Statement

其中,Statement可以是(其中) ExpressionStatementBlock

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

代码语言:javascript
复制
LeftHandSide AssignmentOperator Expression
result[i]    =                  k         ; // leaving out the `++` operation for simplicity here

现在,当您更改为第二种方法时,不使用大括号,for使用的Statement仍然是它旁边的第一行

代码语言:javascript
复制
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语句

代码语言:javascript
复制
{ [BlockStatements] }

BlockStatements在哪里

代码语言:javascript
复制
BlockStatement {BlockStatement}

并且每个BlockStatement可以是(其中)一个Statement。因此,您将能够放入希望由for语句执行的任意多个Assignment(请记住,这是一个Statement)。

进一步的阅读

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52955512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档