次のコードのswitch
ステートメントの途中からループステートメントにジャンプします。
while (something = get_something())
{
switch (something)
{
case A:
case B:
break;
default:
// get another something and try again
continue;
}
// do something for a handled something
do_something();
}
これはcontinue
を使用する有効な方法ですか? continue
ステートメントはswitch
ステートメントによって無視されますか?ここでCとC++の動作は異なりますか?
continue
ステートメントは外側のループに関連しており、コードは(このようなジャンプステートメントを回避する)と同等である必要があります。
while (something = get_something()) {
if (something == A || something == B)
do_something();
}
ただし、break
がループを終了すると予想される場合、コメントが示唆するように(falseと評価されるまで、常に別の何かを再試行します)、別の構造が必要になります。
例えば:
do {
something = get_something();
} while (!(something == A || something == B));
do_something();
はい、大丈夫です。if
ステートメントで使用するのと同じです。もちろん、break
を使用してスイッチ内からループを抜けることはできません。
はい、continueはswitchステートメントによって無視され、テスト対象のループの条件に進みます。リッチーによるCプログラミング言語のリファレンスからこの抜粋を共有したいと思います。
continue
ステートメントはbreak
に関連していますが、あまり使用されません。囲むfor
、while
、またはdo
ループの次の反復が開始されます。while
およびdo
では、これはテストパーツがすぐに実行されることを意味します。for
では、制御は増分ステップに渡されます。continueステートメントはループにのみ適用され、
switch
ステートメントには適用されません。ループ内のcontinue
内のswitch
は、次のループ反復を引き起こします。
C++の場合、それについてはわかりません。
構文的に正しいし、スタイル的にも大丈夫です。
良いスタイルでは、すべてのcase:
ステートメントが次のいずれかで終了する必要があります。
break;
continue;
return (x);
exit (x);
throw (x);
//fallthrough
さらに、case (x):
の直後に
case (y):
default:
許可されます-まったく同じ効果を持ついくつかのケースを束ねます。
if(a=4){...}
のように、それ以外は間違いであると疑われます。もちろん、while
を機能させるには、ループ(for
、continue
、do...while
)を囲む必要があります。 case()
だけにループバックしません。しかし、次のような構造:
while(record = getNewRecord())
{
switch(record.type)
{
case RECORD_TYPE_...;
...
break;
default: //unknown type
continue; //skip processing this record altogether.
}
//...more processing...
}
...大丈夫だ。
技術的には有効ですが、これらのジャンプはすべて制御フロー、特にcontinue
ステートメントを不明瞭にします。
私はそのようなトリックを最初の手段ではなく最後の手段として使用します。
どう?
while (something = get_something())
{
switch (something)
{
case A:
case B:
do_something();
}
}
より短く、より明確な方法でその機能を実行します。