1

常にbreakswitch ステートメントを終了する必要がありますか? 単にセミコロン;で終了するのは安全ではありませんか?

switch ( (rand() % 2) ) {
    case 0:
    // Do foo;
    break;
    case 1:
    // Do nothing
    ;
    default:
    ;
}
4

4 に答える 4

16

Duff's Device (メモリ内のある場所から別の場所に N バイトをコピーする関数) を考えてみましょう。

send(to, from, count)
register short *to, *from;
register count;
{
        register n = (count + 7) / 8;
        switch(count % 8) {
        case 0: do {    *to = *from++;
        case 7:         *to = *from++;
        case 6:         *to = *from++;
        case 5:         *to = *from++;
        case 4:         *to = *from++;
        case 3:         *to = *from++;
        case 2:         *to = *from++;
        case 1:         *to = *from++;
                } while(--n > 0);
        }
}

それは機能するだけです-そして、はい、実際に機能します-すべてのケースが次のケースに失敗するためbreak;です。したがって、はい、 を使用して を終了する必要がありますが、次へ進むと役立つ可能性があります。break;casecase

ただし、Duff's Device が簡潔に示しているように、使用せずに失敗すると、自分の利益のためにはトリッキーすぎるbreak;という明確なコード臭があります。

于 2013-06-24T15:30:10.277 に答える
12

セミコロンはスイッチを終了しません。そうしないと、すべてのステートメント (セミコロンで終了) がスイッチを終了します。

ブレークを追加しないと、次のケースが実行されます。上記の場合、default次のように機能し、空ですが、通常、コードは予期しないことを行います...

于 2013-06-24T15:25:43.183 に答える
2

A;は、コントロールが次のステートメントに落ちるのを防ぎません。

そのため、常に with を使用break;してswitchください。適切な代替手段はありません。

A;は単なるステートメント ターミネータです。


あなたのコードに従って、

case 1:
    // Do nothing
    ;

あなたのケースが何の関係もない場合、これは実際には必要ありません。これは単に省略できます。

于 2013-06-24T15:25:30.700 に答える
2

switch ステートメントが定数でのみ機能し、ブレークが必要な理由があります。Switch は、条件ではなくラベルを使用して実装されます。

switch (x){
   case 1: printf("1"); break;
   case 2: printf("2"); break;
}

と同等です

goto label_x; // where x is replaced with it's value
label_1:
        printf("1");
        break;
label_2:
        printf("2");
        break;

そのため、C/C++ でブレークを設定しないと、コードの次の行に進む (フォール スルー) だけです。

ここで C++ 制御構造を確認する必要があります: http://www.cplusplus.com/doc/tutorial/control/

「選択構造:スイッチ」で検索

于 2013-06-24T15:37:36.207 に答える