@sddvxd

Почему нельзя инициализировать в case?

Здравствуйте!
switch(1){
case 1:
    double d = 1; //ошибка
}


объяснение этому я нашел на англоязычном сайте, но полностью понять смысл мне не удалось. объясните пожалуйста, почему так
  • Вопрос задан
  • 740 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert

switch(1){
case 1:
    double d = 1; //ошибка
}

Почему нельзя инициализировать в case?

С этим кодом всё в порядке с точки зрения стандарта. Проблемы начнутся, если добавить меток case в switch после определения переменной d. Переход на эти метки входит в область видимости переменной d, но минует её инициализацию. Это запрещено стандартом (с++98, 6.7:3):

It is possible to transfer into a block, but not in a way that bypasses declarations
with initialization. A program that jumps from a point where a local variable with
automatic storage duration is not in scope to a point where it is in scope is ill-formed
unless the variable has POD type (3.9) and is declared without an initializer.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
BacCM
@BacCM
C++ почти с рождения
Это из кривого наследия C скорее всего.
switch/case сродни goto но не совсем оно
поэтому можно делать всякие дикие вещи с циклами и if перекрывающими части switch.
И в итоге, что получается.
Такой код вполне себе валидный:

int x = 1;
switch (x) {
	case 1:;
	case 2:
		int b = 2;
}

/// Даже с добавлением таких извращений

switch (x) {
	case 1:
		if (a == 1) {
	case 2:
		int b = 2;
	}
}


А такой уже нет
int x = 1;
switch (x) {
	case 2:
		int b = 2;
	case 1:;
}

И вроде как всё объяснимо. с одной стороны b видима везде после её объявления, но в case 1 мы можем придти минуя это объявление, как бы противоречие.
В C таких проблем нет, т.к. переменные должны объявляться в начале блока.
Решить можно 2.5 способами.
1. Обернуть действия в case фигурными скобками
1.5 Вынести их в отдельную функцию
2. Описать переменную до switch
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы