2014-09-29 118 views
1

我的同事和我剛剛進入一個爭論 - 這重新點燃了大學的回憶。不等於對不平等在for循環條件語句 - 在java中

具體我的演講者之一總是寫了他對於這樣的循環:

for(int i = 0; i != max; i++){ ... } 

這似乎我錯了,因爲它掛在你的程序進入一個無限循環,如果你不小心修改我的潛力,我的同事同意我的看法。

寫循環,據我所知道的最常見的方式是:

for(int i = 0 ; i < max; i++){ ... } 

那麼,什麼是每一種方法的優點/缺點?

回答

3

如果該變量在循環中從未發生變異,則的增量值將保證從您的起始值(在本例中爲10)中達到,則兩個循環都是等效的。

如果你決定在你的遞增階段,跳過值你保證準確命中終端條件,則!=形式將導致一個無限循環。

實施例:

for(int i = 0; i < 10; i += 3) { } // will stop after four iterations 

for(int i = 0; i != 10; i += 3) { } // i will exceed 10, and will *not* stop 

的一般約定一向使用作爲決定一個循環時相對嚴格不等式有界不等式;即,一個循環,而他們下面一定值,而不是在它們不是一定值。

這也是保持明確;作爲一件好事你遍歷什麼,和您的最終條件是什麼。如果指定了!=,旁邊的人讀碼將假定,你根本不希望這個數字成爲下一塊迭代的一部分,當意圖是竟多達但不包括。

清晰在這裏是關鍵。

0

1)使用第一個循環,想象一下,如果在循環內部的某個點上添加了某些東西,會發生什麼情況,以至於i > max。你剛剛得到了一個巨大的循環。
當然,你可能真的想只要執行環路i != max但在這種情況下 while(i != max)更容易閱讀。

唯一的方法,你是第一循環是好的,如果你能以某種方式保證i永遠不會超過max

2)第二個循環是和更容易for環讀取。

3)如果要循環使用幷包括max,該怎麼辦?你必須正確i != max + 1; i++在這種情況下我的第二點成立,第二循環更容易閱讀。

+3

我不認爲這將是無限的。它只會做大約40億次迭代,就是這樣。 – Voicu 2014-09-29 01:00:32

+0

如果你有無限的記憶,它會。 – qbit 2014-09-29 01:02:59

+0

@Voicu我使用的環路像'對(INT I = 1;!I = 0; ++ⅰ){...}'用於測試的方法幾乎詳盡。幾秒鐘內終止。 – maaartinus 2014-09-29 01:04:13

1

告訴你的朋友這樣的:一個聰明的人都知道西紅柿是一種fruit and not a vegetable,一個聰明的人知道,你不把西紅柿在水果沙拉。

的一點是:是的,在技術上他可以寫這個for(int i = 0; i != max; i++){ ... }但如果其他程序設計師會讀它 - 他們最有可能的問題的原因。保持簡單和一致。

已經提到:如果for循環中的值發生變化,你可能最終-了無限循環 - 不要做。