我很想知道为什么下面的代码不能连续运行。而且我也在寻找实现我想要实现的目标的一些方法-在循环内部重置循环。我需要这样做,因为我需要考虑容器中的每个元素。之所以这样,是因为我可能从中间开始,并且需要循环回去检查其他人,并且还需要重新检查其他信息。以我的小测试示例为例:
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--;
}
}
我很感激SO所提供的任何反馈,以及需要学习的新知识:-)如果需要更多信息,我将提供。感谢您的时间。
最佳答案
因为条件是在输入循环主体之前检查的。当i == 10
时,循环将中断,直到您的代码在i++
评估为10时才能执行。
请记住,postincrement使变量递增并返回旧值。因此,如果i
为9,i++
的计算结果也为9,但是下次使用i
时,它将为10。
如果希望变量增加并在表达式中使用新值,请使用preincrement:
if (++i == 10) // changes i to i + 1 and checks if the new value of i is 10
您可以完全放弃增量,而只需使用
i + 1
。这样,您不必在i
块中减小else
的增量。您对发布增量的误解也可能是发布的第二个代码块中的错误的根源。您可以将其更改为预递增,或者如果
it
是随机访问迭代器,则可以执行与上述相同的操作,并检查it + 1 == gpc_map_ptr->end()
是否在it
块中不必递减else
。 。