假设此示例代码(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
。
为什么呢?有原因吗?
答案 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)
答案 4 :(得分:1)
实际上,在默认情况下你不需要中断。如果您的检查结果不同,如果您在默认情况下没有中断,则情况相同。
但在我看来,你应该在默认情况下休息,因为:
答案 5 :(得分:1)
break
似乎是可选的。而且你的代码也能正常工作。
在许多情况下,添加break可以改善代码并保护代码免受错误/异常的影响。
它提高了可读性,一致性和更多无错误。
在最后一种替代方案之后,技术上需要一些语言,如C#break(或退出案例的其他控制流语句)。 dan04
所以为了更好的编程实践,我建议人们应该使用它。
有关详细信息,请参阅此excellent post。
答案 6 :(得分:0)
如果最后default
个案,那么break
语句就没用了。如果它在任何其他case
之前,则需要break
。因为通常我们将default
放在最后,所以你可以省略它..