PDA

Visualizza la versione completa : [c++] problema switch


mlipreri
08-01-2008, 16:39
Ciao, perchè accade questo?
Così non va


switch ( value )
{
case 1:
int i; // <-- errore
break;
default:
break;
}

Così va


switch ( value )
{
case 1:
{
int i; // <-- ok
break;
}
default:
break;
}

Cosa cambia?
Grazie

oregon
08-01-2008, 16:46
Cosa vuol dire "non va"?

Non viene compilato? Non viene eseguito? Quale errori eventualmente ti da'?

Quale compilatore usi?

MItaly
08-01-2008, 17:17
Nel secondo caso crei uno scope in cui la variabile è valida, nel primo no. Non creare uno scope quando una variabile viene dichiarata all'interno di un blocco swith può generare una situazione ambigua; considera questo esempio:


switch ( value )
{
case 1:
int i;
i = 25;
//nota: qui non c'è un break
case 2:
i+= 50;
cout<<i;
break;
default:
break;
}
.
Supponi che value sia uguale a 1: in questo caso i assumerà prima il valore 25, poi verrà incrementata di 50 e perciò verrà visualizzato 75. Ma se value è uguale a 2 si verifica un'ambiguità: i, che sarebbe stata una variabile lecita nel caso precedente, ora non è nemmeno dichiarata!

mlipreri
08-01-2008, 17:35
Grazie MItaly per la spiegazione. ;)

MItaly
08-01-2008, 17:53
Prego, ciao! :ciauz:

oregon
08-01-2008, 19:05
Scusate se mi intrometto ma, compilando con C++, non riesco ad avere problemi (anche se non so ancora quale sia il problema, pur avendolo richiesto ...) ...

MItaly
08-01-2008, 19:24
Ricordavo di aver avuto errori del genere, ma ho ricontrollato e mi rendo conto di aver detto una cavolata. L'errore che mi ricordavo era il C2360, "inizializzazione di 'identificatore' ignorata da un'etichetta 'case'" che si verifica in questo caso:


void func( void )
{
int x;
switch ( x )
{
case 0 :
int i = 1; // C2360, skipped by case 1
{ int j = 1; } // OK, initialized in enclosing block
case 1 :
int k = 1; // OK, initialization not skipped
}
}
.
Nel caso del mio esempio precedente, invece, i viene trattata come una normale variabile locale al blocco switch.

Loading