113

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

4

7 に答える 7

64

それは問題ありません、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();
于 2010-01-27T12:34:22.300 に答える
29

はい、continue は switch ステートメントによって無視され、テスト対象のループの条件に進みます。Ritchie による The C Programming Language リファレンスからの抜粋を共有したいと思います。

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

continue ステートメントはループにのみ適用され、ステートメントには適用されませんswitch。ループのcontinue内側switchにあると、次のループの繰り返しが発生します。

C++の場合はわかりません。

于 2013-11-16T14:25:04.580 に答える
21

Yes, it's OK - it's just like using it in an if statement. Of course, you can't use a break to break out of a loop from inside a switch.

于 2010-01-27T12:26:12.770 に答える
8

構文的に正しく、スタイル的にも問題ありません。

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

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

さらに、case (x):すぐに次の

 case (y):
 default:

許容されます-まったく同じ効果を持ついくつかのケースをまとめます。

if(a=4){...} もちろん、当然のように、ループ ( whilefordo...while) を囲む必要がありますcontinue。単独でループバックすることはありませんcase()。しかし、次のような構成:

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

...大丈夫だ。

于 2010-01-27T13:00:27.183 に答える
5

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

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

どうですか

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

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

于 2010-01-27T12:37:15.407 に答える