2017-07-06 45 views
2

所以我有我爲CS50 pset1馬里奧問題創建的代碼。代碼行爲正確,並且正在做它應該做的事情,但我不明白其中的一個部分。它爲什麼這樣表現。爲什麼我的for循環在C中正常工作?

這裏是我寫在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("#"); 
     } 

如果哈希=身高排那麼應該不會是3-0 = 3,並將它打印井號3次?然後3-1 = 2並打印兩次,依此類推?它爲什麼反過來呢?

有人能解釋我的邏輯有什麼問題嗎?

+0

請在調試器中先運行此代碼:( – KevinDTimm

回答

4

答案在for循環的條件和增量部分。

你是正確的,散列的初始值將是3. for循環的條件部分將檢查以確保散列(3)小於或等於高度(3)。那麼,3 < = 3?是。

for循環的增量部分決定了每次迭代中的變化。在你的情況下,散列值將增加1,所以下一次循環執行時,散列值將爲4.條件將檢查:is hash(4)< = height(3)?這將返回false,並且for循環將被終止。

當發生「行」循環的下一次迭代時,散列的初始值爲2(因爲3 - 1 = 2)。這將繼續添加1以散列,直到「散列< = height」返回false。隨着「行」增加,更多的「#」被打印。

+0

現在它是有道理的,感謝您的解釋。 –

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 

總共得到兩個散列,例如

--##