2012-11-07 24 views
2

我試圖讀取這段代碼的輸出,但它只是對我沒有意義。如何閱讀沒有大括號的循環?

即使知道沒有花括號的循環只會循環第一行,輸出仍然沒有任何意義。有些數字可以,但其他數字則沒有。

我的代碼:

int n = 8; 
int i = 1; 
int j = 1; 

j = n + 2; 

System.out.println (n + " " + i + " " + j); 

while (n > 1) 
{ 
    n = n/2; 
    for (i = 2; i <= n; i = i+2) 
     System.out.println (n + " " + i + " " + j); 

    j++; 
} 
System.out.println (n + " " + i + " " + j); 

,並將其輸出:

8 1 10 
4 2 10 
4 4 10 
2 2 11 
1 2 13 

我得到了10年8月1日 和10年4月2日

,但之後的東西,我很難過,我不明白計算機是如何計算其餘的。

有人會介意跟我一起去看看剩下的輸出嗎?

提前致謝。

+8

使用調試器,分步執行該代碼,以瞭解程序做了什麼。 –

+2

可能最好的辦法是在每個System.out中添加一些額外的文本,而不是完全複製/粘貼。這給了你一些關於哪個System.out被執行的線索。 – kosa

回答

9

沒有大括號表示循環僅影響循環後面的下一個語句

所以

for (i = 2; i <= n; i = i+2) 
System.out.println (n + " " + i + " " + j); 

相當於

for (i = 2; i <= n; i = i+2) 
{ 
    System.out.println (n + " " + i + " " + j); 
} 

通常,壓痕在那些情況下使用,使代碼更容易理解,就像這樣:

for (i = 2; i <= n; i = i+2) 
    System.out.println (n + " " + i + " " + j); 

編輯:現在,這是問題的實際答案。這一切都取決於循環所做的不同迭代以及變量如何遞增。

int n = 8; 
int i = 1; 
int j = 1; 

j = n + 2; //This means that j takes the value 10. 

System.out.println (n + " " + i + " " + j); // 8 1 10 So far, so good. 

現在,隨着迭代:

while (n > 1) 
{ 
    n = n/2; 
    for (i = 2; i <= n; i = i+2) 
     System.out.println (n + " " + i + " " + j); 

    j++; 
} 

對於第一次迭代,我們有n=8 i=1 j=10,這樣以來n > 0true循環發生。

n = n/2; //n = 4 

然後,for(請注意,它只是將值2i):

for (i = 2; i <= 4; i = i+2) //Since n = 4 

由於n = 4,即i可以是24,然後打印是唯一值:

4 2 10 
4 4 10 

之後,j是遞增1,使其成爲j = 11while的條件再次滿足,因爲n = 4n = n/2使得n取值2,因此它輸入while again。讓我們來看看再次:

for (i = 2; i <= 2; i = i+2) //Since n = 2 

這一次,是i可以採取的唯一價值是2(注意,i值被再次復位到2同時開始迭代),這就是打印你得到。

2 2 11 

前再次​​進行迭代,j++使得j具有值12

在最後一次迭代中,n = n/2結果爲n = 1,因爲n是int但是這是在while內完成的,因此它再次進入。現在n = 1環路看起來是這樣的:

for (i = 2; i <= 1; i = i+2) //Since n = 1 

i設置爲2,爲的條件不滿足(2 <= 1false)。然後這次沒有打印,但j在該時間結束時增加到13

在下一次迭代中,您有n = 1,這意味着while的條件未滿足,因此迭代中斷。最後你有n = 1,i = 2j = 13。這是你獲得的最後一張照片。

+3

「下面的代碼**聲明**」。你可以在一行中有許多陳述。 – Aziz

+0

感謝@RobertHarvey的編輯,我實際上添加了同樣的東西。 – Gamb

+0

OP在問題中表示他們已經知道這個事實。這可能是他們錯過的其他事情。 –

2

您,其中n = 8,則i = 1和j啓動while循環= 10。

start while: (n=8 > 1) is true 
n = 4 
i = 2 (i <= 4, so do for loop, then change i to i+2=4) 
print 4,2,10 
i = 4 (i <= 4, so do for loop again, then i = i+2 = 6 
print 4,4,10 
i = 6 (i <= 4 is false, so exit for) 
j++ so j becomes 11 

next while: 
n = n/2 = 2 
i = 2 (i <= 2, so do for loop, then change i to i+2=4) 
print 2,2,11 
i = 4 (i <= 2 is false, so exit for) 
j++ -> j = 12 

next while: 
n = n/2 = 1 
i = 2 (i <= 1 is false, so exit loop) 
j++ -> j = 13 

exit while. 
Final print= n = 1, i = 2 (value assigned in last for loop, loop doesn't get executed so i doesnt get incremented by 2), and j = 13 

希望這有助於:)

+0

嘿,我只是想非常感謝你寫這篇文章。它幫助我清楚地理解它。 你真棒。 – Heartbound07

+0

非常歡迎 –