Необязательность break в C++
Команда break является необязательной.
Без нее, однако, поведение блоков case
будет неожиданным. Давайте посмотрим на примере.
Пусть у нас есть вот такой код:
int num = 1;
switch (num) {
case 1:
std::cout << 1 << "\n";
break;
case 2:
std::cout << 2 << "\n";
break;
case 3:
std::cout << 3 << "\n";
break;
}
Уберем в нем все break, а в переменную
num для начала запишем число 3.
Пока все будет работать так, как и работало:
int num = 3; // пусть здесь число 3
switch (num) {
case 1:
std::cout << 1 << "\n";
case 2:
std::cout << 2 << "\n";
case 3:
std::cout << 3 << "\n";
}
// после запуска код выведет 3 - все хорошо
Давайте теперь в переменную num запишем
число 2. В этом случае у нас ожидаемо
выполнится case 2, а затем неожиданно
еще и case 3:
int num = 2;
switch (num) {
case 1:
std::cout << 1 << "\n";
case 2:
std::cout << 2 << "\n";
case 3:
std::cout << 3 << "\n";
}
// после запуска код выведет 2, а затем 3
Если же в переменную num записать
число 1, то вообще выполнятся все
конструкции case:
int num = 1;
switch (num) {
case 1:
std::cout << 1 << "\n";
case 2:
std::cout << 2 << "\n";
case 3:
std::cout << 3 << "\n";
}
// после запуска код выведет 1, затем 2, а затем 3
То есть получается, что при отсутствии break
после выполнения задуманного case
выполнятся и все case ниже него. Иногда
такую особенность используют при решении задач.
В следующем примере, если переменная num
имеет значение 1 или 2, то
в переменную res запишется "a".
Если же переменная num имеет значение
3, то в переменную res
запишется "b":
int num = 1;
std::string res;
switch (num) {
case 1:
case 2:
res = "a";
break;
case 3:
res = "b";
break;
}
std::cout << res << "\n";
Выше я написал, что иногда такую особенность используют, но я, в общем-то, не рекомендую ей пользоваться, так как код становится не очень очевидным.
Очевиднее решить такую задачу через ифы:
int num = 1;
std::string res;
if (num == 1 || num == 2) {
res = "a";
}
if (num == 3) {
res = "b";
}
std::cout << res << "\n";