web-dev-qa-db-ja.com

ブレークなしのswitch-caseステートメント

私が読んでいるこの本によると:

Q switch-caseステートメントでbreakを省略するとどうなりますか?

A breakステートメントを使用すると、プログラムを実行してswitchコンストラクトを終了できます。これがないと、実行は次のcaseステートメントの評価を続けます。

次のようなコードがあると仮定します

switch (option}{
    case 1:
    do A;
    case 2:
    do B;
    default:
    do C;
    break;
}

これは、ケース1を選択した場合、AとCが完了したことを意味しますか。ケース2を選択すると、BとCが完了します。どちらも選択しない場合、Cのみが実行されます。

その場合、Cの後にブレークを省略するとどうなりますか。

私はこれらが悪いプログラミング慣行であると思いますが、それがすべてどのように機能するかをより深く理解するために何が起こるか興味があります。ありがとう

13
Lost1

Breakは「GOTO」コマンドのように機能します。または、より良い例は、「void」関数で「return」を使用するときのようです。そのため、終了なので、その有無にかかわらず違いはありません。私はそれを含めたいのですが。

4
Craig Mosey

選択したケースからbreakが表示されるまで、またはswitchステートメントが終了するまで、すべてを実行します。したがって、Cのみが実行されるか、Bが次にC、またはAとBとCが実行されますが、AとCは実行されない可能性があります

19
Shoe
  • いずれかのケースにブレークを含めない場合、以下のすべてのケースが実行され、ブレークが見つかるまで実行されます。

  • また、デフォルトにブレークを含めない場合、この「デフォルト」のケースの下にはケースがないため、効果はありません。

  • また、一般的には悪い習慣と考えられているブレークを使用していませんが、フォールスルーの性質のためにいつか便利になることもあります:

    ケースオプションA:

    //optionA needs to do its own thing, and also B's thing.
    //Fall-through to optionB afterwards.
    //Its behaviour is a superset of B's.
    

    ケースオプションB:

    // optionB needs to do its own thing
    // Its behaviour is a subset of A's.
    break;
    

    ケースオプションC:

    // optionC is quite independent so it does its own thing.
    break;
    
10
Khatri
switch (option}{
    case 1:
    do A;
    case 2:
    do B;
    case 2:
    do C;
    break;  
    default:
    do C;
}

オプションが1である場合、breakキーワードが見つかるまですべてを実行します。つまり、switch-> case出力の実行を中断します。 :A、B、C

switch (option}{
        case 1:
        do A;
        break;
        case 2:
        do B;
        break;
        do C;
        break;        
        default:
        do D;
    }

オプションが1の場合、出力は次のようになります。

注:defaultbreakを必要としません。

7
Adham Gamal

break行を省略することは悪い習慣であると多くのコメントと回答で見ました。個人的には非常に便利な場合があります。

非常に単純な例を見てみましょう。それはおそらく最高のものではない、単に例証としてそれを取る:
-ログインに失敗した場合、失敗した試行を記録する必要があります。
-3回目の不正な試行では、ログに記録して、さらに何かを行います(アラート管理、アカウントのブロックなど)。

アクションは1回目と2回目の試行で同じであるため、これら2つの間でbreakを使用し、同じコマンドをもう一度書き換える必要はありません。
今度は、他のことを行い、ログも記録したい。最初に他のことを行ってから、1回目と2回目の試行のログアクションを実行します(breakなし)。

switch (badCount) {
    case 3: //only for 3
        alertAdmin();
        blockAccount();
    case 2: //for 2 AND 3
    case 1: //for 1 AND 2 and 3
        errorLog();
        badCount++;
}

私見では、異なるケースに共通のコードを使用するのが非常に悪い習慣だった場合、C構造体は単にそれを許可しません。

3
fpierrat