常にbreak
switch ステートメントを終了する必要がありますか? 単にセミコロン;
で終了するのは安全ではありませんか?
switch ( (rand() % 2) ) {
case 0:
// Do foo;
break;
case 1:
// Do nothing
;
default:
;
}
常にbreak
switch ステートメントを終了する必要がありますか? 単にセミコロン;
で終了するのは安全ではありませんか?
switch ( (rand() % 2) ) {
case 0:
// Do foo;
break;
case 1:
// Do nothing
;
default:
;
}
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;
case
case
ただし、Duff's Device が簡潔に示しているように、使用せずに失敗すると、自分の利益のためにはトリッキーすぎるbreak;
という明確なコード臭があります。
セミコロンはスイッチを終了しません。そうしないと、すべてのステートメント (セミコロンで終了) がスイッチを終了します。
ブレークを追加しないと、次のケースが実行されます。上記の場合、default
次のように機能し、空ですが、通常、コードは予期しないことを行います...
A;
は、コントロールが次のステートメントに落ちるのを防ぎません。
そのため、常に with を使用break;
してswitch
ください。適切な代替手段はありません。
A;
は単なるステートメント ターミネータです。
あなたのコードに従って、
case 1:
// Do nothing
;
あなたのケースが何の関係もない場合、これは実際には必要ありません。これは単に省略できます。
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/
「選択構造:スイッチ」で検索