【问题标题】:Should we break the default case in switch statement?我们应该打破 switch 语句中的默认情况吗?
【发布时间】:2014-11-26 03:41:17
【问题描述】:

假设这个示例代码(source):

#include <stdio.h>

void playgame()
{
    printf( "Play game called" );
}
void loadgame()
{
    printf( "Load game called" );
}
void playmultiplayer()
{
    printf( "Play multiplayer game called" );
}

int main()
{
    int input;

    printf( "1. Play game\n" );
    printf( "2. Load game\n" );
    printf( "3. Play multiplayer\n" );
    printf( "4. Exit\n" );
    printf( "Selection: " );
    scanf( "%d", &input );
    switch ( input ) {
        case 1:            /* Note the colon, not a semicolon */
            playgame();
            break;
        case 2:
            loadgame();
            break;
        case 3:
            playmultiplayer();
            break;
        case 4:
            printf( "Thanks for playing!\n" );
            break;
        default:
            printf( "Bad input, quitting!\n" );
            break;
    }
    getchar();

    return 0;
}

我们应该在last default 的情况下使用break; 吗?如果我删除它,我会看到该程序的相同行为。但是,我看到其他示例在 default 案例中也使用了 break;

为什么?有什么原因吗?

【问题讨论】:

  • 如果break 是最后一个,则在任何 大小写标签之后,您不需要。不管是default还是其他都与此无关。
  • 使用选项 -pedantic 最新版本的 gcc 警告在最后一个 case 之后缺少 break
  • @alk 我被 Eclipse 警告过,没有这个标志。这是编译命令:gcc -std=c99 -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -o "main.o" "../main.c"。也许-Wall 就足够了。
  • "也许 -Wall 就足够了。":更好! :-)

标签: c switch-statement break


【解决方案1】:

这取决于默认情况的编写方式

在以下情况下break是必要的。

switch ( input ) {
    default:
        printf( "Bad input, quitting!\n" );
        break;
    case 1:            /* Note the colon, not a semicolon */
        playgame();
        break;
    case 2:
        loadgame();
        break;
}

【讨论】:

  • 正确,但问题意味着默认情况是最后一个。我会编辑,对不起。
【解决方案2】:

我们应该使用休息吗?在最后一种默认情况下?

来自C 编程语言 - 第二版 (K&R 2):

第 3.4 章切换

作为一种良好的形式,在最后一个 case 之后放置一个 break(默认 这里),即使它在逻辑上是不必要的。有一天,当另一个 案例在最后添加,这一点防御性编程将 救你。

【讨论】:

    【解决方案3】:

    休息似乎是可选的

    break 在这种情况下似乎是可选的。而且您的代码几乎可以正常工作。

    然而

    在许多情况下,添加 break 可以改善您的代码并保护您的代码免受错误/异常的影响。

    它增加了可读性、一致性和更多的无错误。

    在最后一个替代方案之后,技术上需要某种语言,如 C# break(或其他退出案例的控制流语句)。 dan04

    所以为了更好的编程实践,我建议应该使用它。

    查看excellent post了解更多详情。

    【讨论】:

      【解决方案4】:

      如果default case 最终成立,那么break 语句就没有用了。如果它在任何其他case 之前,则需要break。因为通常我们将default 放在最后,所以你可以省略它..

      【讨论】:

      • 不只是default的情况,这里所有的情况都适用
      • @Cool Guy 是的.. 但他问的是默认情况。
      【解决方案5】:

      实际上,默认情况下不需要中断。并且作为您的检查,如果您在默认情况下没有中断,则它是相同的。

      但在我看来,你应该打破默认情况,因为:

      1. 它使您的代码在每种情况下都有一个形式。
      2. 当前编译器很好,但可能不适用于特定的其他编译器。因此,您应该做好准备以防止将来出现问题。

      【讨论】:

        【解决方案6】:

        一方面,您应该考虑一下为什么我们应该在 switch 语句中使用break。看看这个不间断的 switch 语句。

        switch ( input ) {
            case 1:            /* Note the colon, not a semicolon */
                playgame();
            case 2:
                loadgame();
            case 3:
                playmultiplayer();
            case 4:
                printf( "Thanks for playing!\n" );
            default:
                printf( "Bad input, quitting!\n" );
        }
        

        假设input == 1。程序当然会调用playgame(),但是由于没有break,程序不会完成switch而是依次调用loadgame()playmultiplayer()、两个printfs。

        为避免这种情况,我们使用break

        case 1:
            playgame();
            break; /* here */
        case 2:
            ...
        

        由于break,程序在运行case 2的代码之前完成switch语句。这是我们预期的结果,不是吗?

        你的开关是这样的:

        switch ( input ) {
            case 1:            /* Note the colon, not a semicolon */
                playgame();
                break;
            case 2:
                loadgame();
                break;
            case 3:
                playmultiplayer();
                break;
            case 4:
                printf( "Thanks for playing!\n" );
                break;
            default:
                printf( "Bad input, quitting!\n" );
                break;
        }
        

        由于在default 之后没有cases,因此无论您是否在default 上写break 都没有影响。 但是,你可以很容易地假设要写一个新的案例。

            default:
                printf( "Thanks for playing!\n" );
                /* what happens if there's no `break`...? */
            case 5:
                the_new_feature();
                break;
        }
        

        这是 C/C++ 中的常见错误。如果您在 5 年后添加新功能而您完全忘记它,它将成为一个非常错误的错误。一些现代语言(例如 C#,...)甚至 forbid 没有 breakreturn 的 switch-case。

        结论:语法没有问题,但这是非常糟糕的做法,强烈推荐使用break

        【讨论】:

        • 是否允许在default之后有一个case
        • @Rodrigo 是的
        【解决方案7】:

        如果您省略或离开break 语句,则没有区别。这是一个品味问题。

        但是,出于不同的原因编写 break 语句是一个好习惯。

        看看programmers exchange

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多