Помощь - Поиск - Пользователи - Календарь
Полная версия: C++
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
TS*
Выдает ошибку "Case bypasses initalization of local variable", если закоментировать кейс "DIV" или "Default" ошибка пропадает. Может быть баг компилятора (Borland C++ for DOS)?:

enum token_value {
NAME, NUMBER, END,
PLUS='+', MINUS='-', MUL='*', DIV='/',
PRINT=';', ASSIGN='=', LP='(', RP=')'
};
token_value curr_tok;

double term();
double prim();
double expr();
double error(const char* s);
token_value get_token();

double term() {
double left=prim();
for(;;)
switch(curr_tok) {
MUL:
get_token();
left*=prim();
break;
DIV:
get_token();
double d = prim();
if(d==0) return(error("Division by zero"));
left/=prim();
break;
default:
return(left);
}
}

мисс_граффити
{ и } поставь...
volvo
Цитата
Может быть баг компилятора
Да что ты? Какой же баг компилятора, если Стандарт не позволяет обходить неинициализированные переменные? У тебя scope (область видимости переменной d) это что? Весь блок switch, правда? Представь себе, что будет, например, если ты перейдешь по default, и попытаешься использовать переменную d, которая, как правильно говорит компилятор, НЕ инициализирована? (то, что ты ее не используешь, компилятору неинтересно. Факт тот, что ты МОЖЕШЬ ее использовать)...

Что делаем? Либо
1) описываем d видимой во всей функции:
double term()   {  
double d, left=prim();
...
DIV:
get_token();
d = prim();
...
, либо
2) делаем внутренний блок, за пределами которого d невидима:
	 DIV:
{
get_token();
double d = prim();
if(d==0) return(error("Division by zero"));
left/=prim();
}
break;


Я бы выбрал второй вариант...
TS*
Спасибо volvo и мисс_граффити, исправил на второй вариант
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.