2011-07-07 25 views
3

我正在學C語言程序,我正在做一個練習,要求我編寫一個程序打印等腰三角形。認識C塊的問題

#include <stdio.h> 

int main() 
{ 
    int col, row; 

    for(col = 0; col < 6; col++) 
    { 
     for(row = 0; row <= col; row++) 
     { 
      putchar('*'); 
      putchar('\n'); 
     } 
    } 
} 

此代碼自行打印(*)一行21次。所以經過幾分鐘的試驗和錯誤,我刪除了inner for循環中的內括號。

#include <stdio.h> 

int main() 
{ 
    int col, row; 

    for(col = 0; col < 6; col++) 
    { 
     for(row = 0; row <= col; row++) 
      putchar('*'); 
      putchar('\n'); 
    } 
} 

而我終於達到了預期的效果。

因此,我的問題是:內部for循環的內括號{}如何影響結果的打印方式?爲什麼第一組代碼自己打印21次呢?

我翻遍了整本書,無法找到合理的解決方案,以解釋爲什麼{}內循環會影響輸出。

+3

我推薦一本更好的書。 –

+0

我正在閱讀2本書atm,K&R第二版和Sams在21天內教你自己C.你有什麼建議? – nastyn8

+0

@ nastyn8 - 如果K&R沒有解釋這一點(不能確定 - 沒有副本),這個世界是比我想象的更陌生的地方。但是我可以相信,如果你不知道自己做錯了什麼,那麼查找並不容易。 – Steve314

回答

7

你工作的解決方案是相當於

for(col = 0; col < 6; col++) 
{ 
    for(row = 0; row <= col; row++) 
    { 
     putchar('*'); 
    } 
    putchar('\n'); 
} 

在C,壓痕無關with語句的分組。將大隊聲明括在一起。在原始的,不工作的代碼中,內循環後面的大括號使大括號內的所有代碼運行每個循環迭代。在上面的示例中,您可以看到,花括號僅包含for循環的每次迭代運行的適當表達式。

正如其他人可能會注意到:縮進不告訴編譯器該做什麼,但你應該縮進,以便視覺上,你可以解釋你的代碼。

+1

+1 - 但「縮進與分組無關」僅僅是編譯器的觀點。縮進(一致地完成)對於可讀性仍然很重要。即使塊中只有一個語句,除非語句與'for'或其他語句位於同一行,否則忽略括號通常被認爲是不好的風格。另外,由於我脾氣暴躁,我會抱怨你的不一致的開放式支架定位。 – Steve314

+1

+1用於客觀正確的支撐風格。 – detly

+0

該死的 - 你修好了。我想我現在必須對自己保持沉默。 – Steve314

0

當您刪除了一對內部循環大括號時,您將該內部for循環的作用域設置爲打印「*」的單個語句。然後換行符「\ n」每次打印星號時只打印一次而不打印一次。

C中的大括號將語句的「塊」組合在一起,以便它們一起執行。

3

A for(或while)循環執行{ }之間的代碼。

但是,有不使用{ },例如簡稱:

for (i = 0; i < 10; i++) 
    function(); 

for沒有找到{ }它解釋說只剩下一聲明將是循環體的一部分。

你通過反覆試驗達到什麼是等價的:

for(col = 0; col < 6; col++) { 
    for(row = 0; row <= col; row++) { 
     putchar('*'); 
    } 
    putchar('\n'); 
} 

注意putchar('\n')如何超出內部for循環。

+1

Awww我看到了,非常感謝你們的幫助 – nastyn8

+1

它不是「只有下一行」,而只是下一個語句是循環體的一部分。 –

+0

確實會更精確。 –

1

查看它的最好方法是看到大括號將一組語句轉換爲單個語句,就花括號之外的結構而言。一個for循環執行緊隨它後面的語句,在第一次嘗試時它是一個包含兩個打印語句的塊。您的壓痕是誤導性的,如下將更好地被佈置:

for(col = 0; col < 6; col++) 
{ 
    for(row = 0; row <= col; row++) 
    { 
     putchar('*'); 
     putchar('\n'); 
    } 
} 

for(col = 0; col < 6; col++) 
{ 
    for(row = 0; row <= col; row++) 
     putchar('*'); 
    putchar('\n'); 
} 

壓痕被用於指示連續的行,在一個給定的縮進層次是在相同的塊,通常是一個塊由該區塊前面的聲明「擁有」。如果你想用大括號使事情變得更加清晰(許多編碼風格都暗示了這一點),請嘗試:

for(col = 0; col < 6; col++) 
{ 
    for(row = 0; row <= col; row++) 
    { 
     putchar('*'); 
    } 
    putchar('\n'); 
}