for 循环如何在 C 中工作?
How do for loops work in C?
在下面的for循环中,控制流是如何工作的?
int k = 0, x = 7, n = 5;
for (int i = 0; i < x; i++) {
/* When j == 4 in first cycle, k == 5 */
for (j = 0; j < n; j++) {
b[i][j] = a[k];
k++;
}
i++; // i is 2 here.
for (m = j; m >= 0; m--) {
b[i][m] = a[k];
k++;
}
}
第二个 for 循环尝试用 a[k] 设置第一行。
第三个 for 循环尝试用 a[k].
设置第二行
第二个 for 循环是从 j0 到 jn-1,第三个 for 循环是从 jn 到 j1。
以螺旋方式设置行的种类。
我相信对于嵌套循环,语句的执行顺序遵循这种一般形式(从零开始)
for (zero; one; ) {
two;
three;
four;
five;
for (six; seven; ten) {
eight;
nine;
}
}
然后在第二轮
for (zero; twelve; eleven ) {
thirteen;
fourteen;
fifteen;
sixteen;
for (six; seventeen; twenty) {
eighteen;
nineteen;
}
}
首先,x
和 n
永远不会改变,所以让我们把它们的值放在 for 循环中并从代码中删除它们,这样更容易理解。
int k = 0;
for (int i = 0; i < 7; i++) {
for (int j = 0; j < 5; j++) {
b[i][j] = a[k];
k++;
}
i++;
for (int m = j; m >= 0; m--) {
b[i][m] = a[k];
k++;
}
}
• 在第 i 个循环的第一次迭代之前
i = 0;
k = 0;
j 循环从 0 .. 4
b[0][0] = a[0]; // b[i][j] = a[k]
b[0][1] = a[1];
b[0][2] = a[2];
b[0][3] = a[3];
b[0][4] = a[4];
j 循环退出,因为 j 已经达到 5。
k 与 j 相同(从 0 开始,像 j 一样递增)
i 递增成为 1
m 循环从 5 .. 0
b[1][5] = a[5]; // b[i][m] = a[k]
b[1][4] = a[6];
b[1][3] = a[7];
b[1][2] = a[8];
b[1][1] = a[9];
b[1][0] = a[10];
m 循环退出
m = -1;
k = 11;
• 在第 i 循环的第 2 次迭代:
i = 2; (because i *for* loop increments it)
k = 11;
j 循环从 0 .. 4
b[2][0] = a[11]; // b[i][j] = a[k]
b[2][1] = a[12];
b[2][2] = a[13];
b[2][3] = a[14];
b[2][4] = a[15];
j 循环退出,因为 j 已经达到 5。
k = 16;
i 递增成为 3
m 循环从 5 .. 0
b[3][5] = a[16]; // b[i][m] = a[k]
b[3][4] = a[17];
b[3][3] = a[18];
b[3][2] = a[19];
b[3][1] = a[20];
b[3][0] = a[21];
。
.
.
在下面的for循环中,控制流是如何工作的?
int k = 0, x = 7, n = 5;
for (int i = 0; i < x; i++) {
/* When j == 4 in first cycle, k == 5 */
for (j = 0; j < n; j++) {
b[i][j] = a[k];
k++;
}
i++; // i is 2 here.
for (m = j; m >= 0; m--) {
b[i][m] = a[k];
k++;
}
}
第二个 for 循环尝试用 a[k] 设置第一行。 第三个 for 循环尝试用 a[k].
设置第二行第二个 for 循环是从 j0 到 jn-1,第三个 for 循环是从 jn 到 j1。
以螺旋方式设置行的种类。
我相信对于嵌套循环,语句的执行顺序遵循这种一般形式(从零开始)
for (zero; one; ) {
two;
three;
four;
five;
for (six; seven; ten) {
eight;
nine;
}
}
然后在第二轮
for (zero; twelve; eleven ) {
thirteen;
fourteen;
fifteen;
sixteen;
for (six; seventeen; twenty) {
eighteen;
nineteen;
}
}
首先,x
和 n
永远不会改变,所以让我们把它们的值放在 for 循环中并从代码中删除它们,这样更容易理解。
int k = 0;
for (int i = 0; i < 7; i++) {
for (int j = 0; j < 5; j++) {
b[i][j] = a[k];
k++;
}
i++;
for (int m = j; m >= 0; m--) {
b[i][m] = a[k];
k++;
}
}
• 在第 i 个循环的第一次迭代之前
i = 0;
k = 0;
j 循环从 0 .. 4
b[0][0] = a[0]; // b[i][j] = a[k]
b[0][1] = a[1];
b[0][2] = a[2];
b[0][3] = a[3];
b[0][4] = a[4];
j 循环退出,因为 j 已经达到 5。
k 与 j 相同(从 0 开始,像 j 一样递增)
i 递增成为 1
m 循环从 5 .. 0
b[1][5] = a[5]; // b[i][m] = a[k]
b[1][4] = a[6];
b[1][3] = a[7];
b[1][2] = a[8];
b[1][1] = a[9];
b[1][0] = a[10];
m 循环退出
m = -1;
k = 11;
• 在第 i 循环的第 2 次迭代:
i = 2; (because i *for* loop increments it)
k = 11;
j 循环从 0 .. 4
b[2][0] = a[11]; // b[i][j] = a[k]
b[2][1] = a[12];
b[2][2] = a[13];
b[2][3] = a[14];
b[2][4] = a[15];
j 循环退出,因为 j 已经达到 5。
k = 16;
i 递增成为 3
m 循环从 5 .. 0
b[3][5] = a[16]; // b[i][m] = a[k]
b[3][4] = a[17];
b[3][3] = a[18];
b[3][2] = a[19];
b[3][1] = a[20];
b[3][0] = a[21];
。 . .