为什么我在 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
您总共得到两个哈希值,例如
--##
所以我有为 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
您总共得到两个哈希值,例如
--##