代码之家  ›  专栏  ›  技术社区  ›  Matt Joiner

在switch语句中使用continue

  •  64
  • Matt Joiner  · 技术社区  · 15 年前

    我想从一个 switch 语句,到以下代码中的loop语句:

    while (something = get_something())
    {
        switch (something)
        {
        case A:
        case B:
            break;
        default:
            // get another something and try again
            continue;
        }
        // do something for a handled something
        do_something();
    }
    

    这是有效的使用方法吗 continue ?是 持续 语句被忽略 转换 声明?C和C++在这里的行为有什么不同吗?

    6 回复  |  直到 6 年前
        1
  •  48
  •   Kerem    10 年前

    很好, continue 语句与封闭循环相关,您的代码应等效于(避免此类跳转语句):

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

    但是如果你想的话 break 要退出循环,正如您的注释所建议的那样(它总是用另一个东西重试,直到它的值为false),您需要一个不同的结构。

    例如:

    do {
        something = get_something();
    } while (!(something == A || something == B));
    do_something();
    
        2
  •  18
  •   anon    15 年前

    是的,没关系-就像在 if 语句。当然,你不能用 break 从开关内部断开回路。

        3
  •  6
  •   Ed The ''Pro'' Simon Klee    6 年前

    是的,continue将被switch语句忽略,并转到要测试的循环的条件。 我想分享一下Ritchie的C编程语言参考的摘录:

    这个 continue 语句与 break ,但很少使用;它导致封闭的下一个迭代 for ,请 while do 循环开始。在 虽然 ,这意味着立即执行测试部件;在 对于 ,控件传递到增量步骤。

    Continue语句只适用于循环,而不适用于 switch 语句。一 持续 里面 转换 在一个循环内会导致下一个循环迭代。

    我对C++没有把握。

        4
  •  5
  •   SF.    8 年前

    它的句法正确,风格也不错。

    好的风格需要 case: 语句应以以下内容之一结尾:

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

    此外,以下 case (x): 立即

     case (y):
     default:
    

    允许-捆绑几个效果完全相同的案例。

    任何其他事情都被怀疑是错误的,就像 if(a=4){...} 当然,您需要封闭循环( while , for , do...while continue 工作。它不会循环回到 case() 独自一人。但是像这样的结构:

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

    ……可以。

        5
  •  4
  •   Peter Mortensen icecrime    13 年前

    虽然在技术上有效,但所有这些跳转都掩盖了控制流——尤其是 continue 声明。

    我会把这种把戏当作最后的手段,而不是第一个。

    怎么样

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

    它比较短,而且性能更清晰。

        6
  •  -1
  •   Jitendra Nagar    7 年前

    开关不视为循环,因此不能使用 继续 在switch中的case语句中…