簡體   English   中英

在“for”語句中,我應該使用`!=`還是`<`?

[英]In a “for” statement, should I use `!=` or `<`?

我已經看到這兩個聲明:

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

for(i=0;i!=10;i++)

我知道當我達到10時它們都會停止,但使用第二個(我聽說)似乎更好。 有什么不同?我也想知道何時使用迭代器來訪問向量的成員,迭代器條件< vec.end()!= vec.end()之間的區別是什么

for(i = start; i != end; ++i)

這是“標准”迭代器循環。 它的優點是它適用於指針和標准庫迭代器(您不能依賴具有operator< defined的迭代器)。

for(i = start; i < end; ++i)

這不適用於標准庫迭代器(除非它們有operator<定義),但它確實具有如下優點:如果由於某種原因超過了end ,它仍將停止,因此它稍微安全一些。 我在迭代整數時被教導使用它,但我不知道它是否真的被認為是“最佳實踐”。

我通常寫這些的方式是喜歡<

兩者都適用於大多數情況。

如果由於某種原因,在循環中執行的代碼體將i更改為大於10 ,則第一個版本將停止循環,但第二個版本將永久執行。

我的日常做法是使用<當我使用簡單類型(如整數)迭代循環時使用!=當我使用stl-kind迭代器時

for ( initialization ; termination condition ; iteration )

對於每一個,選擇自己最適合您的要求,對於termination condition您可以使用任何二元條件運算符,例如><>=<=!=

對於您提出的問題,請考慮一個隨機案例,其中,

for(i=0;i!=10;i++)
{
 .
 .
 i=11; //somewhere if the loop variable is changed to a value greater than 10 (this assumption is solely for demo)
 .
 .
 .
}

在這種情況下,循環結果是無限的。 相反,如果你使用條件i<10 ,這就像往常一樣。 所以我的觀點是,第一種方法是嚴格設置條件更安全一些。

最佳實踐是使用!=僅使用迭代器(C ++)和<否則。 永遠不要使用==或!=浮點數/雙打。 以下循環是無限循環:

for (double i = 0.0; i != 1.0; i += 0.1)
    printf("yes, I'm an infinite loop ;)");

!=如果i的值超過10,則允許測試評估為真,而如果i超過10或僅僅等於它,則<將導致它評估為假。

如果i的值可能在循環體內發生變化,那么這可能是一個考慮因素。

但是,如果您只是想要做一些事情,<更具描述性,但要么就足夠了。 !=對於簡單的逐步通過10項和咕嚕咕嚕的工作類型的循環,在明確你的意圖方面被認為是次優的。

我知道當我達到10時它們都會停止,但使用第二個(我聽說)似乎更好。

這是一個微觀優化。 使用更有意義的東西(以及<更有意義)。

有什么不同?

第一個版本使用不等式運算符!= ,第二個版本使用less運算符<

由於其他人所說的原因,我通常使用< in for-loops。 在while循環和更高級的for循環中, !=可以更容易地推斷出我的程序的功能。

假設我想在像[5,5,5,3,5,2,3,2,0]這樣的數組中第一次運行'5'后找到位置。 那就是我們想要k使得0 <= i < k => a[i] = 5

int pos = 0;
// Inv: a[0..pos) = 5
while (pos != N && a[pos] == 5)
    pos = pos+1;

一旦循環執行,我們就知道循環保護的反轉是真的: pos == N || a[pos] != 5 pos == N || a[pos] != 5 在這兩種情況下,我們的pos我們想要的。

現在說我們已經在循環守衛中使用了< ,那么之后我們所知道的就是pos >= N || a[pos] != 5 pos >= N || a[pos] != 5 ,但這不是我們想要的情況。做更多的工作,我們可以證明我們不可能在pos > N ,但是這樣的接縫就像浪費時間相比只是在循環保護中使用!=

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM