Как вырваться из петли изнутри выключатель? - PullRequest
100 голосов
/ 14 сентября 2009

Я пишу код, который выглядит следующим образом:

while(true) {
    switch(msg->state) {
    case MSGTYPE: // ... 
        break;
    // ... more stuff ...
    case DONE:
        break; // **HERE, I want to break out of the loop itself**
    }
}

Есть ли прямой способ сделать это?

Я знаю, что могу использовать флаг и выйти из цикла, поставив условный разрыв сразу после переключателя. Я просто хочу знать, есть ли в C ++ какая-то конструкция для этого.

Ответы [ 19 ]

2 голосов
/ 15 июля 2013

Почему бы просто не исправить условие в цикле while, из-за которого проблема исчезла?

while(msg->state != DONE)
{
    switch(msg->state) {
    case MSGTYPE: // ... 
        break;
    // ... more stuff ...
    case DONE:
        // We can't get here, but for completeness we list it.
        break; // **HERE, I want to break out of the loop itself**
    }
}
1 голос
/ 07 января 2014

Я думаю;

while(msg->state != mExit) 
{
    switch(msg->state) 
    {
      case MSGTYPE: // ...
         break;
      case DONE:
      //  .. 
      //  ..
      msg->state =mExit;
      break;
    }
}
if (msg->state ==mExit)
     msg->state =DONE;
0 голосов
/ 14 сентября 2009

Если я хорошо помню синтаксис C ++, вы можете добавить метку к операторам break, как для goto. То, что вы хотите, будет легко написано:

while(true) {
    switch(msg->state) {
    case MSGTYPE: // ...
        break;
    // ... more stuff ...
    case DONE:
        break outofloop; // **HERE, I want to break out of the loop itself**
    }
}

outofloop:
// rest of your code here
0 голосов
/ 08 августа 2016

Я получил ту же проблему и решил с помощью флага.

bool flag = false;
while(true) {
    switch(msg->state) {
    case MSGTYPE: // ... 
        break;
    // ... more stuff ...
    case DONE:
        flag = true; // **HERE, I want to break out of the loop itself**
    }
    if(flag) break;
}
0 голосов
/ 30 января 2012
  while(true)
  {
    switch(x)
    {
     case 1:
     {
      break;
     }
    break;
   case 2:
    //some code here
   break;
  default:
  //some code here
  }
}
0 голосов
/ 22 июня 2011
while(MyCondition) {
switch(msg->state) {
case MSGTYPE: // ... 
    break;
// ... more stuff ...
case DONE:
   MyCondition=false; // just add this code and you will be out of loop.
    break; // **HERE, you want to break out of the loop itself**
}
}
0 голосов
/ 04 мая 2011

Меня удивляет, насколько просто это с учетом глубины объяснений ... Вот все, что вам нужно ...

bool imLoopin = true;

while(imLoopin) {

    switch(msg->state) {

        case MSGTYPE: // ... 
            break;

        // ... more stuff ...

        case DONE:
            imLoopin = false;
            break;

    }

}

LOL !! В самом деле! Это все, что вам нужно! Одна дополнительная переменная!

0 голосов
/ 04 января 2011

Ключевое слово break в C ++ завершает только самую вложенную итерацию или оператор switch. Таким образом, вы не можете выйти из цикла while (true) непосредственно в операторе switch; однако вы можете использовать следующий код, который я считаю отличным шаблоном для такого рода проблем:

for (; msg->state != DONE; msg = next_message()) {
    switch (msg->state) {
    case MSGTYPE:
        //...
        break;

    //...
    }
}

Если вам нужно было что-то сделать, когда msg->state равно DONE (например, запустить процедуру очистки), поместите этот код сразу после цикла for; т.е. если у вас есть:

while (true) {
    switch (msg->state) {
    case MSGTYPE:
        //... 
        break;

    //...

    case DONE:
        do_cleanup();
        break;
    }

    if (msg->state == DONE)
        break;

    msg = next_message();
}

Тогда используйте вместо:

for (; msg->state != DONE; msg = next_message()) {
    switch (msg->state) {
    case MSGTYPE:
        //...
        break;

    //...
    }
}

assert(msg->state == DONE);
do_cleanup();
0 голосов
/ 12 ноября 2009

Самый простой способ сделать это - поместить простой IF перед выполнением ПЕРЕКЛЮЧЕНИЯ, и этот IF проверить ваше условие для выхода из цикла .......... настолько просто, насколько это возможно

...