switch (1) {
case 1:
int i = 0;
break;
default:
break;
}
Здравствуйте, slava_tss, Вы писали:
_>_>switch (1) {
_> case 1:
_> int i = 0;
_> break;
_> default:
_> break;
_>}
_>
Да, ответьте, пожалуйста: "Почему так?"!
p.s. А чего "так" то?
Если есть желание — найдется 1000 возможностей.
Если нет желания — найдется 1000 причин.
Здравствуйте, slava_tss, Вы писали:
_>_>switch (1) {
_> case 1:
_> int i = 0;
_> break;
_> default:
_> break;
_>}
_>
Имеете ввиду это?:
[вывод компилятора:]
error: jump to case label
error: crosses initialization of `int i'
Возникает ошибка из-за того, что i будет видна (если бы это компилировалось, конечно) в последующих блоках ниже case и, если case 1 не был бы выполнен, то мы получили бы нечто вроде "goto в обход инициализации", что запрещено в C++, т.е.:
[код не скомпилируется:]
switch ( 2 ) {
case 1 : int i = 42; break;
case 2 : std::cout << i << std::endl; break; // i не инициализирована
}
Решение:
switch (1) {
// Явно ограничиваем область видимости i
case 1: {
int i = 0;
break;
}
default:
break;
}
// Или:
int i /*= 0, если не хотим, чтобы i осталась неинициализированной в случае, когда условие switch изменится*/;
switch (1) {
case 1:
i = 0;
break;
default:
break;
}
Здравствуйте, slava_tss, Вы писали:
_>_>switch (1) {
_> case 1:
_> int i = 0;
_> break;
_> default:
_> break;
_>}
_>
Потому что неясно, где именно звать конструктор и деструктор, и звать ли.
Так что или ставишь блок, или объявляешь выше.