以下两个for循环有什么区别?
for(int i = 0; i < 5; i++)
{
}
和
for(int i = 0; i < 5;)
{
//End of whatever code to do.
i++;
}
根据http://www.cplusplus.com/doc/tutorial/control/,不应该有区别。 然而,当我运行我的代码(下面的代码)时,取决于iter ++的位置,存在差异。
在这个程序中,我有一个单独的线程运行来获取输入。当我将iter ++移到底层时会发生什么,当一个单独的客户端连接到服务器时,我必须在响应之前在cin流中输入一些内容。
当iter ++位于for循环中的顶部时,不会发生此问题。
我希望我的iter ++位于底部的原因是,当我收到断开连接时,我可以删除地图中的会话。
for (iter = network->sessions.begin(); iter != network->sessions.end(); iter++)
{
//bool Deleted = false;
int data_length = network->receiveData(iter->first, network_data);
if (data_length < 0)
{
//no data recieved
continue;
}
if (data_length == 0)
{
printf("Data closed GRACEFULLY LOL \n");
continue;
}
int i = 0;
while (i < (unsigned int)data_length)
{
packet.deserialize(&(network_data[i]));
i += sizeof(Packet);
switch (packet.packet_type) {
case INIT_CONNECTION:
printf("server received init packet from client\n");
char Buffer[100];
//Buffer to hold char values of client id
_itoa_s(client_id - 1, Buffer, 10);
sendActionPackets(client_id - 1, Buffer);
break;
case ACTION_EVENT:
printf("server received action event packet from client\n");
break;
case TALK:
ProcessTalkLine(packet.Message, sizeof(packet.Message), iter->first);
//sendTalkPackets(packet.Message,sizeof(packet.Message), iter->first);
break;
case DISCONNECTING:
printf("I HAVE RECEIVED DC CONNECT /n");
char theMessage[MAX_MESSAGE_SIZE];
sprintf_s(theMessage, "%s has disconnected.", Usernames.find(iter->first)->second.c_str());
Usernames.erase(iter->first);
//network->sessions.erase(iter++);
break;
default:
printf("error in packet types\n");
break;
}
}
}
编辑:感谢@Matt McNabb指出继续将......继续。我也在那里放入了我的iter ++,但是在我输入内容之前它不会收到消息的问题依然存在。如果我把iter ++留在for循环中,那么这个问题就不存在了。
答案 0 :(得分:6)
当你continue
执行for
中的第三个语句时。在第一种情况下,这会增加i
,而在第二种情况下,它不会增加continue
。
如果您不使用goto
(或{{1}}),则循环仅相同。
答案 1 :(得分:2)
这两个不一样:
for(int i = 0; i < 5; i++)
{
if (some_condition)
continue;
}
和
for(int i = 0; i < 5;)
{
if (some_condition)
continue;
//End of whatever code to do.
i++;
}
答案 2 :(得分:1)
for(int i = 0; i < 5; i++)
{
if (condition)
continue;
//Your Code
}
在上面的for循环中,在条件为真的情况下,循环将继续而不遍历下面的行。但是i值肯定会增加。
for(int i = 0; i < 5;)
{
if (condition)
continue;
//Your Code
i++;
}
在第二个for循环中,行为与上一个相同,但在继续时,i的值不会递增。
在你的情况下,如果你确定要将itr ++放在底部,那么写下如下,
for(int i = 0; i < 5;)
{
if (condition)
goto incrementPoint; //Use goto instead of continue.
//Your Code
incrementPoint: i++;
}
答案 3 :(得分:0)
要真正看到差异,请考虑编译器通常为for循环生成的代码:for(i= initial_value; i<max value; i=i+increment)
注意:这是伪代码并忽略所有编译器优化
**stat_for_loop**:
execute instructions
i=i+increment
if i<max_value
goto **stat_for_loop**
在for循环中添加continue语句时,通常如下所示:
**stat_for_loop**:
execute instructions
if(cond)
goto **next_iteration**
execute instructions
**next_iteration**:
i=i+increment
if i<max_value
goto **stat_for_loop**
你可以清楚地看到,如果忽略for循环中的迭代器增量并且你决定在for块中手动递增它(就像你在while循环中那样),这取决于你何时添加一个continue语句,生成的代码将不同,因此执行路径将是不同的