简单嵌套 for 循环在 C 中无法正常工作(2D 数组初始化)
Simple nested for loops not working correctly in C (2D array initialization)
我不明白为什么这个简单的代码会有这种奇怪的行为。
`代码:
int main(){
int m[10][10];
int i=0;
int j=0;
for (i;i<10;i++) {
for (j;j<10;j++) {
m[i][j]=i+j;
printf("%d ", m[i][j]);
}
printf("\n");
}
printf("%d ", m[4][3]);
}
`
我期待类似矩阵的输出,但输出是这样的:
0 1 2 3 4 5 6 7 8 9
32678
注意程序在32678之前打印了9个空行(m[4][3]的打印值,显然应该是7)。谢谢你的时间。
m[4][3]
正在打印 32678
的原因是因为在外循环的第一次迭代期间调用 printf()
时数组的那部分尚未初始化。
内部循环代码在一次迭代后结束,因为您从未在每次 i
迭代后将循环计数器 j
初始化为 0。请改用此代码:
int main() {
int m[10][10];
for (int i=0; i<10; i++) {
for (int j=0; j<10; j++) {
m[i][j] = i + j;
printf("%d ", m[i][j]);
}
printf("\n");
}
}
for (i;i<10;i++)
{
for (j;j<10;j++)
在这两个循环中,将 i
和 j
初始化为 0
。您将在此处获得类似 output.See 工作程序的矩阵 -https://ideone.com/cm3vV9
这样声明
for (i=0;i<10;i++)
{
for (j=0;j<10;j++)
你在值之间得到 9
行,因为 printf("\n");
运行 9
循环内的时间然后打印 m[4][3]
的值(当然不是它的值只是抛出一些随机值)。
您的 for
循环有点奇怪,因为您实际上并没有在初始化表达式中为循环计数器分配任何内容。例如,这个:
for (i;i<10;i++) {
不寻常...我希望看到这个:
for (i = 0; i < 10; i++) {
...其中 i
在循环开始时设置为 0
。
对于你的外循环,这个怪癖是无害的,因为你在 main()
早些时候将 i
初始化为 0
... 但对于你的 内部 循环,这意味着 j
不会在第二次或以后的循环 运行 处从 0
重新开始,立即使测试表达式为假,并防止循环运行在外循环的第一次迭代之后完全没有。这会使您的大部分数组(第一行之后的所有内容)未初始化。
改变内循环的初始化表达式如下:
for (j = 0; j < 10; j++) {
应该修复它。
请注意,例如。 j;
而不是 j = 0;
因为初始化表达式仍然有效,它只是不 做 任何事情。
仔细考虑 for (j;j<10;j++)
:j
在 i
的后续迭代中不会重置为零。用 for (int j = 0, j < 10, ++j)
等补救此问题,同样适用于 i
。删除 i
和 j
.
的范围更广的声明
for
循环结构中的声明已经成为 C 语言的一部分一段时间了;保持变量范围尽可能局部有助于程序稳定性。
我不明白为什么这个简单的代码会有这种奇怪的行为。
`代码:
int main(){
int m[10][10];
int i=0;
int j=0;
for (i;i<10;i++) {
for (j;j<10;j++) {
m[i][j]=i+j;
printf("%d ", m[i][j]);
}
printf("\n");
}
printf("%d ", m[4][3]);
}
`
我期待类似矩阵的输出,但输出是这样的:
0 1 2 3 4 5 6 7 8 9
32678
注意程序在32678之前打印了9个空行(m[4][3]的打印值,显然应该是7)。谢谢你的时间。
m[4][3]
正在打印 32678
的原因是因为在外循环的第一次迭代期间调用 printf()
时数组的那部分尚未初始化。
内部循环代码在一次迭代后结束,因为您从未在每次 i
迭代后将循环计数器 j
初始化为 0。请改用此代码:
int main() {
int m[10][10];
for (int i=0; i<10; i++) {
for (int j=0; j<10; j++) {
m[i][j] = i + j;
printf("%d ", m[i][j]);
}
printf("\n");
}
}
for (i;i<10;i++)
{
for (j;j<10;j++)
在这两个循环中,将 i
和 j
初始化为 0
。您将在此处获得类似 output.See 工作程序的矩阵 -https://ideone.com/cm3vV9
这样声明
for (i=0;i<10;i++)
{
for (j=0;j<10;j++)
你在值之间得到 9
行,因为 printf("\n");
运行 9
循环内的时间然后打印 m[4][3]
的值(当然不是它的值只是抛出一些随机值)。
您的 for
循环有点奇怪,因为您实际上并没有在初始化表达式中为循环计数器分配任何内容。例如,这个:
for (i;i<10;i++) {
不寻常...我希望看到这个:
for (i = 0; i < 10; i++) {
...其中 i
在循环开始时设置为 0
。
对于你的外循环,这个怪癖是无害的,因为你在 main()
早些时候将 i
初始化为 0
... 但对于你的 内部 循环,这意味着 j
不会在第二次或以后的循环 运行 处从 0
重新开始,立即使测试表达式为假,并防止循环运行在外循环的第一次迭代之后完全没有。这会使您的大部分数组(第一行之后的所有内容)未初始化。
改变内循环的初始化表达式如下:
for (j = 0; j < 10; j++) {
应该修复它。
请注意,例如。 j;
而不是 j = 0;
因为初始化表达式仍然有效,它只是不 做 任何事情。
仔细考虑 for (j;j<10;j++)
:j
在 i
的后续迭代中不会重置为零。用 for (int j = 0, j < 10, ++j)
等补救此问题,同样适用于 i
。删除 i
和 j
.
for
循环结构中的声明已经成为 C 语言的一部分一段时间了;保持变量范围尽可能局部有助于程序稳定性。