【问题标题】:Simple nested for loops not working correctly in C (2D array initialization)简单的嵌套 for 循环在 C 中无法正常工作(二维数组初始化)
【发布时间】:2015-07-20 07:27:02
【问题描述】:

我不明白为什么这个简单的代码会有这种奇怪的行为。

`代码:

  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)。感谢您的宝贵时间。

【问题讨论】:

  • 你在哪里找到这样的 for 循环:for(i;i&lt;10;i++)?
  • 当只有一个循环时它可以工作,初始化在代码之前。我认为这是我应该改掉的坏习惯。
  • 好的@Gandi,但如果你在循环之前初始化i,你可以写for(;i&lt;10;i++)

标签: c arrays loops matrix 2d


【解决方案1】:
   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] 的值(这当然不是它的值,它只是抛出一些随机值)。

【讨论】:

  • ..这将是显而易见的,只需进行最少的调试尝试:(
  • 现在我看到了答案是显而易见的。在问这里之前,我一直在寻找类似的问题,但不知何故,我的大脑没有注意到 j=0,我不知道为什么。我会一直在寻找整个星期,也许没有注意到问题。有时这些停电会发生,至少它们发生在我身上。 (不过,谢谢你教我“公然”这个词,英语不是我的母语,我还是第一次看到)。
【解决方案2】:

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");                      
    }  
}

【讨论】:

  • 他在 c 中工作,for-loop-head 中的声明不起作用。
  • 这并不让我吃惊,但他在循环中使用的逻辑是一个更大的问题。
  • 至少他的程序会编译输出一些东西。
【解决方案3】:

仔细考虑for (j;j&lt;10;j++)ji 的后续迭代中不会重置为零。使用for (int j = 0, j &lt; 10, ++j) 等来解决这个问题,i 也是如此。删除ij 的范围更广的声明。

for 循环结构中的声明已经成为 C 的一部分有一段时间了;将变量范围保持在尽可能本地有助于程序稳定性。

【讨论】:

    【解决方案4】:

    您的for 循环有点奇怪,因为您实际上并没有在初始化表达式中为循环计数器分配任何内容。例如,这个:

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

    是不寻常的......我希望看到这个:

    for (i = 0; i < 10; i++) {
    

    ...其中i 在循环开始时设置为0

    对于您的外部循环,该怪癖是无害的,因为您在 main() 之前将 i 初始化为 0... 但对于您的 inner 循环,这意味着 j 确实在第二次或后续运行循环时不要在 0 重新开始,立即使测试表达式为假,并在外循环的第一次迭代后完全阻止循环运行。这会使您的大部分数组(第一行之后的所有内容)都未初始化。

    改变内部循环的初始化表达式如下:

        for (j = 0; j < 10; j++) {
    

    应该修复它。

    请注意,例如。 j; 而不是 j = 0;,因为初始化表达式仍然有效,它只是没有任何事情。

    【讨论】:

      猜你喜欢
      • 2013-01-28
      • 2014-05-24
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-04
      相关资源
      最近更新 更多