Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ C++

Автор: TS* 21.01.2007 3:01

Выдает ошибку "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);
}
}


Автор: мисс_граффити 21.01.2007 3:07

{ и } поставь...

Автор: volvo 21.01.2007 3:13

Цитата
Может быть баг компилятора
Да что ты? Какой же баг компилятора, если Стандарт не позволяет обходить неинициализированные переменные? У тебя 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* 21.01.2007 3:34

Спасибо volvo и мисс_граффити, исправил на второй вариант