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--;
    }
}

我很感激 SO 必须提供的任何反馈,以及任何要学习的新东西 :-) 如果需要更多信息,我会提供。感谢您的时间。

4

1 回答 1

3

因为在进入循环体之前检查了条件。When ,循环被破坏,在你的代码可以在计算为 10i == 10的时间执行之前。i++

请记住,后增量递增变量并返回旧值。因此,如果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. 这样你就不必ielse块中递减。

您对后增量的误解可能也是您发布的第二个代码块中的错误来源。您可以将其更改为预增量,或者如果it是随机访问迭代器,您可以执行与上述相同的操作,并检查是否it + 1 == gpc_map_ptr->end()必须itelse块中减量。

于 2012-09-25T19:07:00.857 回答