web-dev-qa-db-ja.com

switchステートメントのデフォルトのケースを壊す必要がありますか?

この例のコード( 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の場合。

どうして?理由はありますか?

19
gsamaras

休憩を使用する必要があります。最後のデフォルトのケースでは?

FromCプログラミング言語-第2版(K&R 2):

第3.4章スイッチ

論理的には不要ですが、形式の問題として、最後のケース(ここではデフォルト)の後に区切りを入れます。いつか最後に別のケースが追加されるとき、この防御的なプログラミングのビットはあなたを救います。

39
David Ranieri

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つのprintfs。

これを回避するには、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の後にはdefaultsがないため、breakdefaultに書き込んでも、書き込んでも影響はありません。 ただし、新しいケースを書くことは簡単に想定できます。

_    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バグになります。 forbidbreakreturnもないswitch-caseでさえ、いくつかの最新の言語(C#など)。

結論:問題はありませんin syntaxですが、これは非常に悪い習慣であり、breakを使用することを強くお勧めします。

6
ikh

デフォルトの大文字小文字の書き方に依存します。

次の場合はbreakが必要です。

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

省略した場合、またはbreakステートメントを残した場合、違いはありません。それは好みの問題です。

ただし、さまざまな理由でbreakステートメントを作成することをお勧めします。

programmers exchange を見てください。

2
Igor

ブレークはオプションのようです

その場合、breakはオプションのようです。また、コードはほぼ正常に動作します。

しかしながら

多くの状況で、ブレークを追加するとコードが改善され、エラー/例外からコードが保護されます。

読みやすさ、一貫性が向上し、エラーがなくなります。

最後の代替案の後には、C#ブレーク(またはケースを終了する他の制御フローステートメント)などの言語が技術的に必要です。 dan04

したがって、より良いプログラミングの実践のために、私はそれを使用することをお勧めします。

詳細はこちら excellent post をご覧ください。

1
alamin

実際には、デフォルトのケースではブレークは必要ありません。そして、あなたのチェックとして、デフォルトのケースでブレークがない場合も同じです。

しかし、私の意見では、デフォルトのケースではブレークが必要です。

  1. それはあなたのコードがあらゆる場合にフォームを持っていることを確認します。
  2. 現在のコンパイラでは問題ありませんが、他の特定のコンパイラではそうでない場合があります。ですから、将来の問題を防ぐために、それをよくする必要があります。
1
Le Dong Thuc

defaultケースが最後にある場合、breakステートメントは不要です。他のcaseの前にある場合は、breakが必要です。通常は最後にdefaultを付けるので、省略できます。

0
Rustam