C ++ For Switch Logic

时间:2013-10-28 12:57:20

标签: c++

我的代码中有这个:

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'

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

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

5 个答案:

答案 0 :(得分:5)

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

  • 将内循环移动到自己的函数中,然后使用return退出;或
  • 设置一个标志以指示内循环应该退出;或
  • 使用goto跳出内循环。

答案 1 :(得分: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使用{em>礼貌用于通过嵌套的开关/循环进行转义。

  

“这是使用goto的最后一个据点。” read here

答案 2 :(得分:1)

您可以将播放器的数据包循环重构为自己的函数或方法,然后条件语句可能会有return;,这会将您转回到播放器循环中。

void processPackets(player){
  for(each packet of this player)
  { 
    switch(packet_id)
    {
      case PACKET_TYPE:
      { 
         if(something is wrong)
         {
           return;
         }
      }break;
     }
   }
}

答案 3 :(得分:0)

boolproceedToNextPlayer怎么样?:

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

答案 4 :(得分: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;
         }
     }
  }