Какой смысл в использовании {
и }
в case
заявлении? Обычно, независимо от того, сколько строк в case
операторе, выполняются все строки. Это просто правило относительно старых / новых компиляторов или за этим стоит что-то?
int a = 0;
switch (a) {
case 0:{
std::cout << "line1\n";
std::cout << "line2\n";
break;
}
}
и
int a = 0;
switch (a) {
case 0:
std::cout << "line1\n";
std::cout << "line2\n";
break;
}
c++
switch-statement
Махмуд
источник
источник
switch
ключевым словом, а во втором примере вложенные операторы имеют только один отступ. Обратите внимание, как у вас есть неудобное удаление отступа в четыре пробела послеbreak;
.statement
. В C ++ можно (один из компонентов синтаксической категорииstatement
- этоdeclaration statement
).Ответы:
{}
Обозначает новый блок сферы .Рассмотрим следующий очень надуманный пример:
Вы получите ошибку компилятора, потому что
x
она уже определена в области видимости.Разделение их на их собственные подсистемы устранит необходимость объявления
x
вне оператора switch.источник
TL; DR
Единственный способ объявить переменную с инициализатором или каким-либо нетривиальным объектом внутри кейса - это ввести область видимости блока, используя
{}
или другую структуру управления, которая имеет собственную область видимости, такую как цикл или оператор if .Кровавые подробности
Мы можем видеть, что кейсы - это просто помеченные операторы, такие как метки, используемые с оператором goto ( это описано в разделе 6.1 проекта стандарта C ++ с пометкой ), и мы можем видеть из
6.7
параграфа 3 раздела, что переход объявления во многих случаях не допускается , в том числе с инициализацией:и предоставляет этот пример:
Обратите внимание, здесь есть некоторые тонкости, вы можете пропустить скалярное объявление , не имеющее инициализации, например:
совершенно верно ( живой пример ). Конечно, если вы хотите объявить одну и ту же переменную в каждом случае, тогда каждому из них понадобится своя область видимости, но это работает так же, как и вне переключателя. операторов , так что это не должно быть большим сюрпризом.
Что касается обоснования запрета перехода после инициализации, отчет 467 о дефекте, хотя и охватывает несколько иную проблему, представляет собой разумный случай для автоматических переменных :
Вероятно, более интересно взглянуть на случай, когда вы расширяете область действия в рамках переключателя на несколько случаев, наиболее известным примером этого, вероятно, является устройство Даффа, которое будет выглядеть примерно так:
источник
Это привычка, которая позволяет вам вставлять объявления переменных с результирующим деструктором (или конфликтами областей видимости) в
case
предложения. Другой способ взглянуть на это - они пишут для того языка, который они хотели бы иметь, где все управление потоком состоит из блоков, а не последовательностей операторов.источник
Отметьте это базовым ограничением компилятора, и вы начнете задаваться вопросом, что происходит:
Это даст вам ошибку:
Пока этого не будет:
источник
Использование скобок в переключателе обозначает новый блок области видимости, как сказал Ротем.
Но это также может быть для ясности при чтении. Чтобы знать, где остановится дело, поскольку в нем может быть условный разрыв.
источник
Причины могут быть:
источник