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

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

#include  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情况下。

为什么? 有原因吗?

我们应该rest一下吗? 在最后的默认情况下?

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

第3.4章交换机

作为一个好的forms,在最后一个案例(默认在这里)之后rest,即使它在逻辑上是不必要的。 有一天,当最后添加另一个案例时,这一点防御性编程将拯救你。

首先,你应该考虑为什么我们应该在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() ,两个printf

为了避免这种情况,我们使用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 case没有任何case ,因此无论是否在default写入break没有效果。 但是 ,您可以轻松地设想编写新案例。

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

这是C / C ++中的常见错误 。 如果你在5年后添加新function并且你完全忘记它,它将成为一个非常错误的 bug。 一些现代语言(例如C#,……)甚至禁止切换案例而不会breakreturn

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

这取决于如何编写默认情况

在下面的例子中, 中断是必要的。

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

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

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

看看程序员交流 。

实际上,在默认情况下你不需要中断。 而且,如果您在默认情况下没有中断,那么它也是一样的。

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

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

打破似乎是可选的

在这种情况下, break似乎是可选的。 而且你的代码也能正常工作。

然而

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

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

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

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

有关详细信息,请参阅此优秀post 。

如果default情况是最后一个,则break语句没有用。 如果是在任何其他case之前,则需要break 。 因为通常我们将default在最后,所以你可以省略它。