2016-12-29 44 views
0

我不知道該代碼的編譯方式(使用Visual Studio代碼僅供參考)嵌套的for循環如何在C#中工作

int i,j; 

for(i=0; i<=6; i++) { 

    for (j=1; j<=7-i; j++) { 

     Console.Write("*"); 

    } 
    Console.Write("\n"); 
} 

我的問題是,當代碼開始被編譯,第爲循環進行了測試,它將是真的,然後嵌套for循環然後測試,這將是真實的,所以「Console.Write(」*「);被寫入。瞭解發生了什麼或爲什麼會發生。編譯器然後運行 Console.Write(「\ n」);或...

+3

然後,它將執行'j ++'並再次執行'j <= 7-i'測試並打印星號,直到該條件爲假。然後它將寫入換行符並執行'i ++'並檢查'i <= 6'條件,然後根據需要多次運行內部循環等等。 – juharr

+2

附註:確保你理解「編譯」和「執行/運行」之間的區別,因爲後期可能會混合這兩者。 –

+0

爲什麼不直接使用調試器來遍歷代碼來查看它究竟做了什麼? (代碼在編譯時不會執行任何操作,除非進行編譯;您必須在執行任何操作之前執行它,差異是非常重要的。) –

回答

1

變量的變化是這樣的。

i = 0 : j changes from 0 to 7 (7- i, but i = 0) 
i = 1 : j changes from 0 to 6 (7 - i, i = 1) 
. 
. 
. 
. 
i = 6: j changes from 1 to 1 (7 - i, i = 6) 

在您打印j循環和新行字符的每個i循環中。

|j-loop|i-loop| 
|******|'\n' | 

所以,你會得到輸出,

******* 
****** 
***** 
**** 
*** 
** 
* 
0

i: 0j: 1 to 7打印*,然後打印\n

i: 1j: 1 to 6打印*,然後打印\n 等和

1

我也不會輕易告訴你的輸出,因爲你的問題不是輸出是什麼,但怎麼for循環作品。

讓我們一步一步來做。下面是一些僞代碼:

for (init; condition; increment) 
{ 
     Console.Write("*"); 
} 
  1. init首先執行並遇到迴路時,只進行一次。 for循環只有一次正確。
  2. 評估condition。如果這是真的,身體就會被執行。所以執行Console.Write("*");
  3. 執行increment
  4. condition再次被評估。如果這是真的,身體就會被執行。所以執行Console.Write("*");

步驟3和4完成,直到condition爲假。一旦它是假的循環退出並執行下面的代碼行。

在你的問題你有一個循環,如果條件爲真,它會啓動另一個循環。此循環從1開始,如果i爲0,則從7中減去7 - 7爲0,並且由於j爲0且小於7,它執行主體並打印一個*。它繼續執行步驟3和4並打印一個*七次。那麼這個條件是錯誤的,所以它跳到內部循環之外並打印一個新行。

然後執行外部循環的步驟3和4。

它一直這樣做,直到外循環中的條件評估爲false。

2

如果你不明白一個for循環,你可以隨時將其降低到簡單的語句:

for (init ; condition; increment) 
    body; 

只是一個寫

init; 
while (condition) 
{ 
    body; 
    increment; 
} 

所以,你的循環較短方式

for(i=0; i<=6; i++) { 
    for (j=1; j<=7-i; j++) { 
    Console.Write("*"); 
    } 
    Console.Write("\n"); 
} 

只是一種簡短的寫作方式

i = 0; 
while (i <= 6) 
{ 
    j = 1; 
    while (j <= 7 - i) 
    { 
    Console.Write("*"); 
    j++; 
    } 
    Console.Write("\n"); 
    i++; 
} 

更清楚了嗎?

如果還不清楚,可以進一步降低。

while(condition) 
    body 

只是寫

START: 
if (!condition) 
    goto END; 
body; 
goto START; 
END: 

所以,你的循環只是很短的方式:

i = 0; 
START_1: 
if (!(i <= 6)) 
    goto END_1; 
j = 1; 
START_2: 
if (!(j <= 7 - i)) 
    goto END_2; 
Console.Write("*"); 
j++; 
goto START_2; 
END_2: 
Console.Write("\n"); 
i++; 
goto START_1; 
END_1: 

的是,現在清楚了嗎?