web-dev-qa-db-ja.com

switchステートメントでcontinueを使用する

次のコードの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++の動作は異なりますか?

69
Matt Joiner

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();
50
visitor

はい、大丈夫です。ifステートメントで使用するのと同じです。もちろん、breakを使用してスイッチ内からループを抜けることはできません。

20
anon

はい、continueはswitchステートメントによって無視され、テスト対象のループの条件に進みます。リッチーによるCプログラミング言語のリファレンスからこの抜粋を共有したいと思います。

continueステートメントはbreakに関連していますが、あまり使用されません。囲むforwhile、またはdoループの次の反復が開始されます。 whileおよびdoでは、これはテストパーツがすぐに実行されることを意味します。 forでは、制御は増分ステップに渡されます。

continueステートメントはループにのみ適用され、switchステートメントには適用されません。ループ内のcontinue内のswitchは、次のループ反復を引き起こします。

C++の場合、それについてはわかりません。

10
Islam Elshahat

構文的に正しいし、スタイル的にも大丈夫です。

良いスタイルでは、すべてのcase:ステートメントが次のいずれかで終了する必要があります。

 break;
 continue;
 return (x);
 exit (x);
 throw (x);
 //fallthrough

さらに、case (x):の直後に

 case (y):
 default:

許可されます-まったく同じ効果を持ついくつかのケースを束ねます。

if(a=4){...}のように、それ以外は間違いであると疑われます。もちろん、whileを機能させるには、ループ(forcontinuedo...while)を囲む必要があります。 case()だけにループバックしません。しかし、次のような構造:

while(record = getNewRecord())
{
    switch(record.type)
    {
        case RECORD_TYPE_...;
            ...
        break;
        default: //unknown type
            continue; //skip processing this record altogether.
    }
    //...more processing...
}

...大丈夫だ。

7
SF.

技術的には有効ですが、これらのジャンプはすべて制御フロー、特にcontinueステートメントを不明瞭にします。

私はそのようなトリックを最初の手段ではなく最後の手段として使用します。

どう?

while (something = get_something())
{
    switch (something)
    {
    case A:
    case B:
        do_something();
    }        
}

より短く、より明確な方法でその機能を実行します。

5