[英]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.