оператор switch-case без перерыва

согласно этой книге я читаю:

Q Что произойдет, если я пропущу перерыв в операторе switch-case?

a оператор break позволяет выполнить программу для выхода из конструкции коммутатора. Без него выполнение продолжает оценивать следующие операторы case.

предположим, если у меня есть коды, похожие на

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

означает ли это, что если я выбираю случай 1, A и C сделаны. Если я выберу случай 2, B и C будут сделаны. Если я не выберу ни то, ни другое, только C сделано.

если да, то что произойдет, если мы опустим перерыв после do C.

5 ответов


разрыв действует как команда "GOTO", или , что может быть лучшим примером, это похоже на использование функции" return "для функции" void". Поэтому, поскольку его конец, не имеет значения, есть ли его там или нет. Хотя мне нравится его включать.


вы выполняете все, начиная с выбранного случая, пока не увидите break или switch заявление заканчивается. Таким образом, может быть, выполняется только C, или B, а затем C, или A и B и C, но никогда A и c


  • если вы не включаете перерыв в любом случае, то весь случай ниже будет выполнен, и пока он не увидит перерыв.

  • и если вы не включаете перерыв по умолчанию, то это не вызовет никакого эффекта, так как нет ни одного случая ниже этого случая "по умолчанию".

  • и не использовать перерыв обычно считается плохой практикой, но некоторое время он также может пригодиться из-за его провальной природы.Например:

    случае optionA:

    //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.
    

    case optionB:

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

    case optionC:

    // optionC is quite independent so it does its own thing.
    break;
    

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

если ваш вариант 1 он выполняет все, пока не найдет break ключевое слово... что означает перерыв конец excution switch -->case Выход: a затем B, затем C поэтому рекомендуется ставить перерыв после каждого случая например:

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

если ваш вариант 1 выход будет: просто A ...


Я видел во многих комментариях и ответах, что это плохая практика, чтобы исключить break линии. Лично я считаю, что в некоторых случаях это очень полезно.

давайте возьмем очень простой пример. Это, наверное, не лучший, просто возьмите его в качестве примера:
- при неправильном входе в систему вам нужно зарегистрировать неудачную попытку.
- для третьей неудачной попытки вы хотите войти в систему и сделать некоторые дополнительные вещи (alert admin, block account,...).

так как действие одинаково для первая и вторая попытка, не нужно break между этими двумя и переписывать одни и те же команды во второй раз.
Теперь в третий раз, вы хотите сделать другие вещи, а также войти. Просто сначала сделайте другие вещи, а затем пусть он работает (нет 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 просто не позволила бы этого.