我们应该在switch语句中打破默认情况吗?

时间:2014-10-01 10:11:57

标签: c switch-statement break

假设此示例代码(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;
}

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

为什么呢?有原因吗?

7 个答案:

答案 0 :(得分:33)

  

我们应该休息一下;在最后一个默认情况下?

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

第3.4章开关

  

作为一个好的形式,在最后一个案例之后休息(默认情况下)   尽管它在逻辑上是不必要的。有一天当另一个   案件最后添加,这一点防御性编程将会   救你。

答案 1 :(得分:5)

首先,您应该考虑为什么我们应该在switch语句中使用break。看看这个不破坏的开关声明。

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(),两个{{ 1}}顺序。

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

break

由于case 1: playgame(); break; /* here */ case 2: ... ,程序在运行break的代码之前完成switch语句。这是我们的预期结果,不是吗?

您的开关是这样的:

case 2

由于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; } 之后没有case,因此您是否在default上写break无效。 然而,您可以轻松地假设撰写新案例。

default

C / C ++中的常见错误。如果您在5年后添加新功能并且完全忘记它,它将成为非常错误的错误。一些现代语言(例如C#,......)甚至禁止没有 default: printf( "Thanks for playing!\n" ); /* what happens if there's no `break`...? */ case 5: the_new_feature(); break; } break的案例。

结论:在语法中没有问题,但这是非常糟糕的做法,强烈建议使用return

答案 2 :(得分:3)

取决于如何编写默认案例

在下列情况下,中断是必要的。

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

答案 3 :(得分:2)

如果省略或留下break声明,则无差异。这是一个品味问题。

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

看看programmers exchange

答案 4 :(得分:1)

实际上,在默认情况下你不需要中断。如果您的检查结果不同,如果您在默认情况下没有中断,则情况相同。

但在我看来,你应该在默认情况下休息,因为:

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

答案 5 :(得分:1)

打破似乎是可选的

在这种情况下,

break似乎是可选的。而且你的代码也能正常工作。

然而

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

它提高了可读性,一致性和更多无错误。

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

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

有关详细信息,请参阅此excellent post

答案 6 :(得分:0)

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