我正在做一些练习,但遇到了一些我不太了解的事情。下面是代码和我不完全理解的部分,我将放在*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>
答案 0 :(得分:4)
此
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++;
基本上,当不使用花括号时,诸如for
,while
,if
等的指令仅将下一行解释为要作为其一部分执行的代码块它的声明。
在您的情况下,您将result[i++] = k;
(一行)替换为(两行)
result[i] = k;
i++
通过这种方式,将第二行(i++
)从要由for执行的语句中删除。遵循相同的原理,外循环也忽略i++
句子。
正确使用花括号和代码格式时,这永远不会发生。
这是for
语句:
for ( [ForInit] ; [Expression] ; [ForUpdate] ) Statement
Statement
可以(除其他外)是ExpressionStatement
或Block
。
您通过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] }
BlockStatement {BlockStatement}
每个BlockStatement
都可以是Statement
。这样一来,您就可以放入希望由Assignment
s语句执行的Statement
个语句(记住这是一个for
)。
其他读数: