我无法理解为什么这个简单的代码有这种奇怪的行为。
`code:
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)。谢谢你的时间。
答案 0 :(得分:4)
for (i;i<10;i++)
{
for (j;j<10;j++)
在这两个循环中,将i
和j
初始化为0
。你会得到类似矩阵的输出。参见这里的工作程序 - https://ideone.com/cm3vV9
像这样声明
for (i=0;i<10;i++)
{
for (j=0;j<10;j++)
您在值之间得到9
行,因为printf("\n");
在循环内运行9
时间然后打印m[4][3]
的值(这不是它的值,它只会抛出一些随机值)。
答案 1 :(得分:3)
m[4][3]
打印32678
的原因是因为在外部循环的第一次迭代期间调用printf()
时,该部分数组尚未初始化。
内循环代码在一次迭代后结束,因为在j
的每次迭代后,您永远不会将循环计数器i
初始化为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");
}
}
答案 2 :(得分:2)
仔细考虑for (j;j<10;j++)
:在j
的后续迭代中,i
不会重置为零。使用for (int j = 0, j < 10, ++j)
等对i
进行相似处理。删除i
和j
的更广泛的范围声明。
for
循环结构中的声明现在已经成为C的一部分了;尽可能保持变量范围有助于程序的稳定性。
答案 3 :(得分:1)
您的for
循环有点奇怪,因为您实际上并未在初始化表达式中为循环计数器分配任何内容。例如,这个:
for (i;i<10;i++) {
很不寻常......我期待看到这一点:
for (i = 0; i < 10; i++) {
...其中i
在循环开始时设置为0
。
对于你的外循环,这个怪癖是无害的,因为你在i
之前将0
初始化为main()
...但对于你的内部循环,它意味着j
在循环运行的第二次或后续时间不会在0
重新开始,立即使测试表达式为false,并在第一次迭代后阻止循环运行外循环。这使得你的大部分数组(第一行之后的所有内容)都未初始化。
更改内循环的初始化表达式如下:
for (j = 0; j < 10; j++) {
应该修复它。
请注意,例如。 j;
代替j = 0;
,因为初始化表达式仍然有效,它只是没有做任何事情。