2012-09-25 85 views
0

我很好奇爲什麼下面的代碼不能在連續的循環中運行。而且我還在尋找一些方法來實現我想實現的目標 - 重置循環內部的循環。我需要這樣做,因爲我需要考慮容器中的每個元素。之所以這樣,是因爲我可能從中間開始,並且需要循環查看其他人並需要重新檢查其他信息。所以,在我的小測試例如:重置循環中的循環

for (int i = 0; i != 10; i++) { 
    std::cout << std::endl << "TEST: " << i << std::endl; 
    if (i++ == 10) { 
     i = 0; 
    } else { 
     i--; 
    } 
} 

有什麼特別的原因上述不起作用?我對知道爲什麼非常感興趣,所以我可以瞭解一切如何運作。這也導致我面臨的一個更大的問題。下面的代碼是。我正在使用MSVC++ 2010 Express。此外,這是一個線程,所以其他數據不能訪問它。這是一個使用STL的unordered_map。其大小如果2(我檢查)。

for (game_player_client_map::const_iterator it = gpc_map_ptr->begin(); it != gpc_map_ptr->end(); ++it) { 
    if (it++ == gpc_map_ptr->end()) { 
     cout << endl << "IT == gpc_map_ptr->end()" << endl; 
     it = gpc_map_ptr->begin(); 
    } else { 
     it--; 
    } 
} 

我明白任何反饋,以便所提供的,並且如果需要進一步的信息我會提供任何新的東西:-)學習。感謝您的時間。

+1

'i = 9; std :: cout << i ++;' –

回答

3

因爲在輸入循環體之前檢查了條件。當i == 10,循環被打破,之前你的代碼可以在當時執行該i++將評估爲10

請記住,後置遞增變量並返回舊值。所以,如果i是9,i++評估爲9還可以,但下次使用i時間,這將是10

如果您希望變量遞增,並在表達式中使用新的值,使用前增量:

if (++i == 10) // changes i to i + 1 and checks if the new value of i is 10 

但是,您可以完全消除增量,只使用i + 1。這樣,您不必在else區塊中減去i

您對postincrement的誤解也可能是您發佈的第二個代碼塊中的錯誤來源。您可以將其更改爲預增量,或者如果it是隨機訪問迭代器,則可以執行與上述操作相同的操作,並檢查it + 1 == gpc_map_ptr->end()是否必須在else塊中取消增加it

+0

謝謝你,塞斯。我不知道發佈和預增量。而這些新信息將會變得非常有價值。這令我再次驚喜。 – User

+0

@Ohmages是的,在表達式中使用post/pre增量是非常棘手的,使用正確的是至關重要的。 –