所以我有我为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并打印两次,依此类推?为什么反过来呢?
有人可以解释我的逻辑有什么问题吗?
答案 0 :(得分:4)
答案在for循环的条件和增量部分。
你是正确的,hash的初始值是3. for循环的条件部分将检查以确保hash(3)小于或等于height(3)。那么,3 <= 3?是。
for循环的增量部分确定每次迭代中的更改。在你的情况下,hash将增加1,所以下次执行循环时,hash的值为4.条件将检查:是hash(4)&lt; = height(3)?返回false,for循环终止。
当“行”循环的下一次迭代发生时,哈希的初始值为2(因为3 - 1 = 2)。这将继续向哈希添加1,直到“hash&lt; = height”返回false。随着“行”的增加,更多的“#”被打印出来。
答案 1 :(得分:2)
让我们分解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
你总共获得两个哈希,例如
--##