解释一下这个嵌套的 for 循环?

Explain this nested for loop?

这是创建一个宽度和高度已经设置好的正方形,并使用破折号将其打印到输出中,并且运行完美;但我似乎并不完全理解第二个和第三个循环在做什么以及它的 运行。

- (void)draw {
    for (int w = 1; w <= width; w++) {
        printf("-");
    }

    ***
    for (int h = 0; h <= height; h++) {
        printf("\n");
        printf("|");

        for (int space = 0; space <= width; space++) {
            printf(" ");

        }

        printf("|");
    }
    ***

    for (int w = 1; w <= width; w++) {
        if (w == 1) {
            printf("\n");
        }

        printf("-");

        if (w == width)
            printf("\n");
        }  
    }
}

"\n" 表示新行,因此 second 循环开始新行然后打印管道(竖线)。

for (int h = 0; h <= height; h++) {  
    printf("\n");
    printf("|");

third 循环打印出一堆空格。

for (int space = 0; space <= width; space++) {  
    printf(" ");

second 循环然后为框的右边缘打印另一个管道。

printf("|");

second 循环然后 "loops" 并重复多次。

最后一个循环打印一个新行,然后打印一串破折号“-”作为底边。

第一个循环打印出顶部的水平虚线。

下一个循环为每行打印两条垂直虚线,首先打印左边的虚线,然后遍历宽度和打印空格,然后打印右边的虚线。对于正方形高度的每一行都会发生这种情况。

最后一个循环最终打印出底线的破折号。

你问的中间循环基本上画了盒子的左右两边,一个'|'一次,从上到下...打印第一个 |在左侧,然后是一堆空格,然后是第一个 |在右侧。然后它向下移动到下一行并再次重复。

可能更容易形象化:

在第一个循环之后你会得到类似这样的东西(假设宽度 = 15)

 ---------------

一旦第二个开始,它会插入一个换行符并在左侧打印一个竖线 |,留下:

--------------- |

然后内部循环插入宽度为您的宽度的空格,(此处表示为 o)留下您:

 ---------------
|ooooooooooooooo

插入空格后,右侧绘制了另一个管道,剩下的是:

 ---------------
|               |

这会持续 height 次,直到您剩下(假设高度 = 5):

 ---------------
|               |
|               |
|               |
|               |
|               |

最后,最后一个循环打印底部,就像顶部一样:

 ---------------
|               |
|               |
|               |
|               |
|               |
 ---------------