以下两个for循环之间有什么区别?
for(int i = 0; i < 5; i++)
{
}
Run Code Online (Sandbox Code Playgroud)
和
for(int i = 0; i < 5;)
{
//End of whatever code to do.
i++;
}
Run Code Online (Sandbox Code Playgroud)
根据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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:感谢@Matt McNabb指出继续将......继续.我也把它放在我的iter ++中,但是在我输入内容之前它不会收到消息的问题依然存在.如果我把forer ++留在for循环中,那么这个问题就不存在了.