Почему можно объявить переменную в операторе switch?а не декларация + инициализация? - PullRequest
3 голосов
/ 23 мая 2019
  1. Почему объявление + инициализация переменной внутри случая оператора switch недопустимо и выдает ошибку, но если оно объявлено в одной строке, а затем присвоено значение в другой, оно компилируется?
  2. Почему переменная, которая была объявлена ​​в предыдущем случае, может использоваться (работать) в другом подходящем случае, даже если предыдущие операторы случая не выполнялись!

Этот код компилируется без ошибок или предупреждений:

char ch; cin>> ch;
switch(ch)
{
    case 'a':
        int x;  // How come this is ok but not this(int x = 4;)?
        x = 4;
        cout<< x << endl;
        break;
    case 'b':
        x += 1;  // x is in scope but its declaration did not execute!
        cout<< x << endl;
        break;
    case 'c': 
        x += 1;
        cout<< x << endl;
        break;
}

Я ожидал case 'b' Или case 'c', чтобы не знать, что существует переменная с именем x.Я знаю, что переменная все еще находится в области видимости в случае b и случае c.

case 'a' печатает 4

case 'b' печатает 1

case 'c 'prints 1

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

  1. почему переменная x не может бытьопределены и инициализированы?Какие проблемы это может создать, что это не разрешено делать?

Если разрешено определять переменную только в одном операторе, тогда переменная используется в соответствующем случае, и любой мусор был втам привыкаешь;так в чем же отличие от объявления + инициализации значения?

1 Ответ

4 голосов
/ 23 мая 2019

Метка регистра работает как цель оператора goto.

Стандарт C ++ содержит: [stmt.dcl]/3:

Можно передать в блок, но не так, чтобы обойти объявления с инициализацией .

Таким образом, приведенное ниже не удастся:

case 'a':
    int x = 4; //will fail

тогда как следующее не подведет:

case 'a':
    int x;  // this is ok 
    x = 4;

В ответ на редактирование ОП:

В этом конкретном случае только объявление делает x видимым по всему выражению switch, поскольку вокруг него нет фигурных скобок {}. Так что x можно использовать и с другими case, хотя компилятор предупредит об их использовании неинициализированным. Обратите внимание, что чтение неинициализированной переменной является неопределенным поведением.

Чтобы ответить на последнюю часть вашего вопроса:
Предположим, что объявление с инициализацией было разрешено, это означало бы, что это конкретное значение x (в данном случае 4) должно использоваться и в других case s. Тогда казалось бы, что код для нескольких случаев был выполнен. Так что это не разрешено.

...