@sddvxd

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

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


объяснение этому я нашел на англоязычном сайте, но полностью понять смысл мне не удалось. объясните пожалуйста, почему так
  • Вопрос задан
  • 112 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24

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
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Particle Москва
от 150 000 руб.
BuildSafe Tech Санкт-Петербург
от 120 000 руб.
ТехноКад Москва
До 120 000 руб.
19 марта 2019, в 10:33
20000 руб./за проект
19 марта 2019, в 10:19
500 руб./за проект