この例のコード( 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;
lastdefault
の場合?削除すると、プログラムの同じ動作が表示されます。ただし、他の例でもbreak;
default
の場合。
どうして?理由はありますか?
休憩を使用する必要があります。最後のデフォルトのケースでは?
FromCプログラミング言語-第2版(K&R 2):
第3.4章スイッチ
論理的には不要ですが、形式の問題として、最後のケース(ここではデフォルト)の後に区切りを入れます。いつか最後に別のケースが追加されるとき、この防御的なプログラミングのビットはあなたを救います。
1つには、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()
、2つのprintf
s。
これを回避するには、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;
}
_
case
の後にはdefault
sがないため、break
をdefault
に書き込んでも、書き込んでも影響はありません。 ただし、新しいケースを書くことは簡単に想定できます。
_ default:
printf( "Thanks for playing!\n" );
/* what happens if there's no `break`...? */
case 5:
the_new_feature();
break;
}
_
C/C++ではcommon-mistakesです。 5年後に新しい機能を追加し、それを完全に忘れた場合、それはvery buggyバグになります。 forbidbreak
もreturn
もないswitch-caseでさえ、いくつかの最新の言語(C#など)。
結論:問題はありませんin syntaxですが、これは非常に悪い習慣であり、break
を使用することを強くお勧めします。
デフォルトの大文字小文字の書き方に依存します。
次の場合は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ステートメントを作成することをお勧めします。
programmers exchange を見てください。
その場合、break
はオプションのようです。また、コードはほぼ正常に動作します。
多くの状況で、ブレークを追加するとコードが改善され、エラー/例外からコードが保護されます。
読みやすさ、一貫性が向上し、エラーがなくなります。
最後の代替案の後には、C#ブレーク(またはケースを終了する他の制御フローステートメント)などの言語が技術的に必要です。 dan04
したがって、より良いプログラミングの実践のために、私はそれを使用することをお勧めします。
詳細はこちら excellent post をご覧ください。
実際には、デフォルトのケースではブレークは必要ありません。そして、あなたのチェックとして、デフォルトのケースでブレークがない場合も同じです。
しかし、私の意見では、デフォルトのケースではブレークが必要です。
default
ケースが最後にある場合、break
ステートメントは不要です。他のcase
の前にある場合は、break
が必要です。通常は最後にdefault
を付けるので、省略できます。