2016-05-21 20 views
2

我應該使用for或while循環來查找鏈接列表中的最後一個項目嗎?對於雖然用於查找鏈表中的最後一個項目

Item * last = list; 
for (; last->next; last = last->next) ; 

Item * last = list; 
while (last->next) 
{ 
    last = last->next; 
} 

它是2線與5,它似乎幾乎同樣可讀。爲什麼我總是隻看到時間表?

+0

'for'循環通常表明循環變量是循環的私有局部細節。如果循環的目的是改變一些* other *,外部變量,那麼'while'版本在這方面就更清楚了。特別是,如果for循環的增量部分改變了外部狀態,這可能很難看到和混淆。 –

+0

我相信兩者在記憶和時間上都是平等的。 –

+0

這幾乎是個人偏好.. – Shury

回答

2

如果你要比較線數,至少要儘量合理地做到這一點。該for循環的格式應該更多這樣的:

Item * last = list; 
for (; last->next; last = last->next) 
    ; 

這使得它更明顯的是,for環路(故意)控制空語句。該while循環可以寫成更是這樣的:

Item * last = list; 
while (last->next) 
    last = last->next; 

如果我們堅持,我們需要支架周圍連一個控制語句,他們還是結了相同的行數爲每個:

Item * last = list; 
for (; last->next; last = last->next) { 
    ; 
} 

VS:

Item * last = list; 
while (last->next) { 
    last = last->next; 
} 

所以,行數的差異純粹由於您選擇使用(和,特別是,事實上,你沒有使用相同的,甚至格式化兩者格式相似)。

其他人已經指出,這些可能編譯爲相同的代碼,我同意你可以(也應該)期望這是合理的編譯器。

將風格和可讀性留作唯一區別。在這方面,for循環顯然是優選的。很少有人從早期暴露於BASIC(或可能是FORTRAN)之後就沒有恢復過來,因此堅持認爲for循環只應用於簡單的計數循環,如BASIC和FORTRAN中支持的循環。將這個限制應用於C或C++只是錯誤的和愚蠢的。 C的for循環由於一個很好的理由而變得更加多才多藝,並且對其進行純粹的人爲限制根本沒有任何好處。

簡單的經驗法則:如果您實際上至少使用for循環標題中的三個子句中的兩個,則最好使用for循環而不是while循環。具有空體的for循環與具有空體的構造函數大致相似:對於不知道該語言的人可能不熟悉和困惑,但對任何真正瞭解該語言的人而言,它是微不足道的,並且與手指在他們的手上。

4

這兩個循環在邏輯上是等價的,而且很可能最終會被編譯爲相同的代碼。

使用你喜歡的任何一個。

1

因爲當您知道您要製作多少個步驟時會使用。而且,這個循環的變量可以是私有的(迭代器)。

使用直到符合條件。您可以使用此循環模擬所有循環。

但是,正如人們可以很容易看到的那樣,兩者都可以使用,因爲它們是等價的。

5

爲什麼我總是隻看到while表單?

有兩個原因,爲什麼while形式是優選的:

  • 循環空的身體不作爲至少有一個說法在他們的身上循環爲可讀 - 編程新的C找到在for循環之後的分號混淆了,或者甚至完全錯過了分號,不理解正在發生的事情。關於while循環沒有這樣的混淆。
  • for帶循環變量聲明在循環之外提供了一個強烈的跡象表明,你實際上想要一個循環while - 循環變量的範圍是循環的主體。當你在循環之外聲明它們時,這是因爲你想循環結果中的循環變量的結束值。
+0

我不知道第二點。如果你的循環有一個'continue',你可能仍然需要'for'提供的迭代保證。 – Barry

相關問題