简单嵌套for循环在C中无法正常工作(2D数组初始化)

时间:2015-07-20 07:27:03

标签: c arrays loops matrix 2d

我无法理解为什么这个简单的代码有这种奇怪的行为。

`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)。谢谢你的时间。

4 个答案:

答案 0 :(得分:4)

   for (i;i<10;i++)
      {
               for (j;j<10;j++)  

在这两个循环中,将ij初始化为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进行相似处理。删除ij的更广泛的范围声明。

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;,因为初始化表达式仍然有效,它只是没有任何事情。