2013-10-28 44 views
0

我有这个在我的代码: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语句中?

  • 休息会导致'病例'中断;
  • A继续;会导致下一个数据包被重复使用
  • ..?
+1

您可以使用goto语句。您可以将内部循环放入函数中并从中返回。你可以使用一个标志,这是在两个循环中检查。这并不重要。 – selalerer

回答

5

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

  • 将内部循环移入其自己的函数中,并使用return退出;或
  • 设置一个标志来指示内部循环应该退出;或
  • 使用goto跳出内部循环。
+0

必须以其他方式管理它,因为我期待比使用gotos/flags更清楚地编码。 – PeeS

+0

通过将内部循环移入自己的函数来处理它,当需要时从方法调用“返回”以跳过处理当前玩家。 对不起,DUP,现在可以关闭了。 – PeeS

2

中断会导致'病例'中断吗?

是的。

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

是的。

可以添加一个标志并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的最后一个据点。”read here

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

您可以重构为玩家进入自己的函数或方法和条件语句中的数据包环路,则可能有一个return;这会甩了你回来进入玩家循环。

void processPackets(player){ 
    for(each packet of this player) 
    { 
    switch(packet_id) 
    { 
     case PACKET_TYPE: 
     { 
     if(something is wrong) 
     { 
      return; 
     } 
     }break; 
    } 
    } 
} 
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; 
     } 
    } 
    }