Using continue in a switch statement

后端 未结 7 506
盖世英雄少女心
盖世英雄少女心 2020-12-13 03:29

I want to jump from the middle of a switch statement, to the loop statement in the following code:

while (something = get_something())
{
    swi         


        
相关标签:
7条回答
  • 2020-12-13 03:39

    Switch is not considered as loop so you cannot use Continue inside a case statement in switch...

    0 讨论(0)
  • 2020-12-13 03:40

    Yes, it's OK - it's just like using it in an if statement. Of course, you can't use a break to break out of a loop from inside a switch.

    0 讨论(0)
  • 2020-12-13 03:42

    While technically valid, all these jumps obscure control flow -- especially the continue statement.

    I would use such a trick as a last resort, not first one.

    How about

    while (something = get_something())
    {
        switch (something)
        {
        case A:
        case B:
            do_something();
        }        
    }
    

    It's shorter and perform its stuff in a more clear way.

    0 讨论(0)
  • 2020-12-13 03:46

    Yes, continue will be ignored by the switch statement and will go to the condition of the loop to be tested. I'd like to share this extract from The C Programming Language reference by Ritchie:

    The continue statement is related to break, but less often used; it causes the next iteration of the enclosing for, while, or do loop to begin. In the while and do, this means that the test part is executed immediately; in the for, control passes to the increment step.

    The continue statement applies only to loops, not to a switch statement. A continue inside a switch inside a loop causes the next loop iteration.

    I'm not sure about that for C++.

    0 讨论(0)
  • 2020-12-13 03:46

    It's syntactically correct and stylistically okay.

    Good style requires every case: statement should end with one of the following:

     break;
     continue;
     return (x);
     exit (x);
     throw (x);
     //fallthrough
    

    Additionally, following case (x): immediately with

     case (y):
     default:
    

    is permissible - bundling several cases that have exactly the same effect.

    Anything else is suspected to be a mistake, just like if(a=4){...} Of course you need enclosing loop (while, for, do...while) for continue to work. It won't loop back to case() alone. But a construct like:

    while(record = getNewRecord())
    {
        switch(record.type)
        {
            case RECORD_TYPE_...;
                ...
            break;
            default: //unknown type
                continue; //skip processing this record altogether.
        }
        //...more processing...
    }
    

    ...is okay.

    0 讨论(0)
  • 2020-12-13 04:00

    It's fine, the continue statement relates to the enclosing loop, and your code should be equivalent to (avoiding such jump statements):

    while (something = get_something()) {
        if (something == A || something == B)
            do_something();
    }
    

    But if you expect break to exit the loop, as your comment suggest (it always tries again with another something, until it evaluates to false), you'll need a different structure.

    For example:

    do {
        something = get_something();
    } while (!(something == A || something == B));
    do_something();
    
    0 讨论(0)
提交回复
热议问题