为什么我在 C 中的 for 循环可以正常工作?

Why is my for loop in C working correctly?

所以我有为 CS50 pset1 Mario 问题创建的代码。代码运行正确,并且正在做它应该做的事情,但我不明白其中的一部分。为什么会这样。

这是我用 C 编写的代码:

  #include <cs50.h>
#include <stdio.h>

int main (void){
int height, row, space, hash;

    do {
        printf("Height: ");
        height = get_int();
    } while(height<0 || height>23);

    for (row=0; row<height; row++){

        for (space=height-(row+1); space>0; space--){
            printf("-");
        }

        for (hash=height-row; hash<=height; hash++){
            printf("#");
        }

        printf("#\n");
    }

}

例如,当用户输入 3 作为高度时,我得到

--##
-###
####

我不明白为什么不是:

--####
-###
##

这部分让我失望:

for (hash=height-row; hash<=height; hash++){
            printf("#");
        }

如果 hash = height-row 那么它不应该是 3-0=3 并让它打印井号 3 次吗?然后3-1=2再打印两次,以此类推?为什么会反过来呢?

有人可以解释一下我的逻辑有什么问题吗?

答案在for循环的条件和增量部分。

hash 的初始值为 3 是正确的。for 循环的条件部分将检查以确保 hash (3) 小于或等于 height (3)。那么,是 3 <= 3 吗?是的

for循环的递增部分决定了每次迭代改变什么。在你的例子中,hash 将增加 1,所以下次执行循环时,hash 的值为 4。条件将检查:是 hash (4) <= height (3)? returns false,for 循环将终止。

当"row"循环的下一次迭代发生时,散列的初始值为2(因为3 - 1 = 2)。这将继续向散列加 1,直到 "hash <= height" returns false。随着 "row" 的增加,将打印更多的“#”。

让我们分解一下 for 循环:

     for (hash=height-row; hash<=height; hash++){
        printf("#");
        }

当高度为3时:

for row = 0 (less than 3):
    for (hash = 3 - 0; hash <= 3 (true); hash++ (hash will be 4 next iteration))
        print #

接下来,

    for (has = 4; hash <= 3 (false); hash ++)
        (does not print #) 

最后,

    print #\n

您总共得到两个哈希值,例如

--##