Почему при использование static в switch происходит ошибка?

155
19 февраля 2018, 03:10

Почему когда использую статическую переменную в 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++ не допускает указанной ситуации.

Answer 1

Дело в том, что конструкция 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)
READ ALSO
Почему закрывается всё приложение?

Почему закрывается всё приложение?

У меня есть основное окно в котором считаются точки, а потом выводятся графикиПочему у меня закрывается вся программа, когда закрываешь окно...

103
Проверка на пустой ввод с++

Проверка на пустой ввод с++

Проверка на пустой ввод или то, что введенная строка НЕ цифра работает через разДопустим, если два раза ввести пустую строку в поток, то когда...

213
Поиск в массиве. Найти наибольшее в строке и наименьшее в столбце

Поиск в массиве. Найти наибольшее в строке и наименьшее в столбце

Дан двумерный массивНайти наибольшее значение в строке и наименьшее значение в столбце

133
QMessageBox перевод кнопок

QMessageBox перевод кнопок

Как в таком примере перевести кнопки с YES/NO на свой текст либо загрузке файла с переводом

198