почему так?
От: slava_tss  
Дата: 20.09.08 13:10
Оценка:
switch (1) {
    case 1:
        int i = 0;
        break;
    default:
        break;
}
Re: почему так?
От: k55 Ниоткуда  
Дата: 20.09.08 14:38
Оценка:
Здравствуйте, slava_tss, Вы писали:

_>
_>switch (1) {
_>    case 1:
_>        int i = 0;
_>        break;
_>    default:
_>        break;
_>}
_>


Да, ответьте, пожалуйста: "Почему так?"!

p.s. А чего "так" то?
Если есть желание — найдется 1000 возможностей.
Если нет желания — найдется 1000 причин.
Re: почему так?
От: Аноним  
Дата: 20.09.08 15:14
Оценка:
Здравствуйте, 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;
}
Re: почему так?
От: VoidEx  
Дата: 20.09.08 17:21
Оценка: 1 (1) +1
Здравствуйте, slava_tss, Вы писали:

_>
_>switch (1) {
_>    case 1:
_>        int i = 0;
_>        break;
_>    default:
_>        break;
_>}
_>


Потому что неясно, где именно звать конструктор и деструктор, и звать ли.
Так что или ставишь блок, или объявляешь выше.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.