0

我的代码中有这个:

for(each player)
{
  for(each packet of this player)
  { 
    switch(packet_id)
    {
      case PACKET_TYPE:
      { 
         if(someething is wrong)
         {
           skip this player iteration and go on with next player
         }
      }break;
     }
   }
}

有两个“FOR”和一个“SWITCH”

我如何从 switch 语句中退出当前的 PLAYER 迭代,跳转到另一个玩家?

  • 休息会导致“案例”破裂;
  • 一个继续;将导致下一个数据包被迭代
  • .. ?
4

5 回答 5

5

没有特别好的方法可以做到这一点。选项是:

  • 将内部循环移动到它自己的函数中,并使用return;退出 或者
  • 设置一个标志来指示内部循环应该退出;或者
  • 用于goto跳出内循环。
于 2013-10-28T13:01:27.770 回答
2

休息会导致“案件”破裂吗?

是的。

一个继续;会导致下一个数据包被迭代吗?

是的。

AND (&&)您可以使用内部循环添加一个标志和它:

for(each player)
{
    bool flag = true;
    for(each packet of this player && flag)
    {                              ^^^^^^^ 
        switch(packet_id)
        {
            case PACKET_TYPE:
            { 
                if(someething is wrong)
                {
                    flag = false;
                    ^^^^^^^^^^^^^
                }
            }break;
        }
    }
}

此外,在这种情况下,还有一种礼貌的用法,goto用于通过嵌套的开关/循环进行转义。

“这是使用goto的最后一个据点。” 在这里阅读

于 2013-10-28T12:59:44.960 回答
1

您可以将播放器的数据包循环重构为它自己的函数或方法,然后条件语句可以有一个return;将您转储回播放器循环的语句。

void processPackets(player){
  for(each packet of this player)
  { 
    switch(packet_id)
    {
      case PACKET_TYPE:
      { 
         if(something is wrong)
         {
           return;
         }
      }break;
     }
   }
}
于 2013-10-28T13:02:09.387 回答
0

bool国旗呢proceedToNextPlayer?:

for(each player)
{
  bool proceedToNextPlayer = false;
  for(each packet of this player && !proceedToNextPlayer) 
  { 
    switch(packet_id)
    {
      case PACKET_TYPE:
      { 
         if(someething is wrong)
         {
           proceedToNextPlayer = true;
           skip this player iteration and go on with next player
         }
      } break;
     }
   }
}
于 2013-10-28T13:01:36.287 回答
0

您始终可以使用标志:

for(each player)
{
    bool skip_this_player = false;
    for(each packet of this player and not skip_this_player)
    { 
        switch(packet_id)
        {
            case PACKET_TYPE:
            { 
                if(someething is wrong)
                {
                    skip_this_player = true;
                    continue;
                }
             }break;
         }
     }
  }
于 2013-10-28T13:02:33.110 回答