我们应该在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#,……)甚至禁止切换案例而不会break
或return
。
结论: 语法没有问题,但是非常糟糕的做法,强烈建议使用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,因为:
- 它使您的代码在每种情况下都有一个表单。
- 它对当前的编译器很好,但可能不适用于特定的其他编译器。 所以你应该做好以防止将来发生问题。
打破似乎是可选的
在这种情况下, break
似乎是可选的。 而且你的代码也能正常工作。
然而
在许多情况下,添加break可以改善代码并保护代码免受错误/exception的影响。
它提高了可读性,一致性和更多无错误。
在最后一种替代方案之后,技术上需要一些语言,如C#break(或退出案例的其他控制流语句)。 dan04
所以为了更好的编程实践,我建议人们应该使用它。
有关详细信息,请参阅此优秀post 。
如果default
情况是最后一个,则break
语句没有用。 如果是在任何其他case
之前,则需要break
。 因为通常我们将default
在最后,所以你可以省略它。