Почему когда использую статическую переменную в switch case выдает ошибки : "initialization of "counter" is skipped by 'case' label", "initialization of "counter" is skipped by 'default' label"
int num = 1;
switch (num)
{
case 1:
static int counter = 0;
cout << "COUNTER = " << counter;
counter++;
break;
case 0:
cout << "000";
break;
default:
cout << "Error";
break;
}
Эту ошибку можно исправить путём перемещения статической переменной в самый низ, но почему c++ не допускает указанной ситуации.
Дело в том, что конструкция switch/case в С++ является модифицированным оператором goto, и блоки case не создают новую область видимости. Соответственно переменная counter может быть использована в блоках case 0 и default, но инициализация этой переменной происходит только при выполнении блока case 1. Это может привести к использованию переменной couter без инициализации.
Следует вручную создать новую область видимости. Теперь counter не виден из других блоков и не может быть случайно использован внутри них:
case 1:
{
static int counter = 0;
cout << "COUNTER = " << counter;
counter++;
break;
}
Или вынести эту переменную наружу, тогда counter может быть использован и в других блоках, но всегда будет инициализирован.
static int counter = 0;
switch (num)
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники