我正在做一些练习,我遇到了一些我不太了解的东西。下面是一个代码和我不完全理解的部分,我将把它放在星号之间,比如*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
,但这给出了一个完全不同的输出,尽管在我看来它是相同的。
发布于 2018-10-24 02:44:50
TL;DR
这
for (int j = 1; j <= n; ++j)
for (int k = 1; k <= j; ++k)
result[i++] = k;
等同于下面的代码(用大括号格式化),它在两个循环中递增 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++;
等同于下面的代码(用大括号格式化),它在执行两个循环之后递增 i
循环:
for (int j = 1; j <= n; ++j) {
for (int k = 1; k <= j; ++k) {
result[i] = k;
}
}
i++;
基本上,当不使用大括号时,for
、while
、if
等指令只将下一行解释为要作为其语句的一部分执行的代码块。
在本例中,您将result[i++] = k;
(一行)替换为(两行)
result[i] = k;
i++
这样,将由for执行的语句中的第二行(i++
)。遵循同样的原则,外部循环也会忽略i++
语句。
当正确使用花括号和代码格式时,应该不会发生这种情况。
长篇大论
这是for
语句:
for ( [ForInit] ; [Expression] ; [ForUpdate] ) Statement
其中,Statement
可以是(其中) ExpressionStatement
或Block
。
您在执行result[i++] = k;
时使用的ExpressionStatement
是一个Assignment
(实际上是其中的两个:result[i] = k;
和i = i + 1
,但是在one行中),它是:
LeftHandSide AssignmentOperator Expression
result[i] = k ; // leaving out the `++` operation for simplicity here
现在,当您更改为第二种方法时,不使用大括号,for
使用的Statement
仍然是它旁边的第一行
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] }
BlockStatement {BlockStatement}
并且每个BlockStatement
可以是(其中)一个Statement
。因此,您将能够放入希望由for
语句执行的任意多个Assignment
(请记住,这是一个Statement
)。
进一步的阅读
https://stackoverflow.com/questions/52955512
复制相似问题