简单嵌套 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++)  

在这两个循环中,将 ij 初始化为 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++)ji 的后续迭代中不会重置为零。用 for (int j = 0, j < 10, ++j) 等补救此问题,同样适用于 i。删除 ij.

的范围更广的声明

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