Ciao, perchè accade questo?
Così non va
Così vacodice:switch ( value ) { case 1: int i; // <-- errore break; default: break; }
Cosa cambia?codice:switch ( value ) { case 1: { int i; // <-- ok break; } default: break; }
Grazie
Ciao, perchè accade questo?
Così non va
Così vacodice:switch ( value ) { case 1: int i; // <-- errore break; default: break; }
Cosa cambia?codice:switch ( value ) { case 1: { int i; // <-- ok break; } default: break; }
Grazie
Cosa vuol dire "non va"?
Non viene compilato? Non viene eseguito? Quale errori eventualmente ti da'?
Quale compilatore usi?
No MP tecnici (non rispondo nemmeno!), usa il forum.
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:
.codice: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!
Amaro C++, il gusto pieno dell'undefined behavior.
Grazie MItaly per la spiegazione.![]()
Prego, ciao!![]()
Amaro C++, il gusto pieno dell'undefined behavior.
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 ...) ...
No MP tecnici (non rispondo nemmeno!), usa il forum.
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:
.codice: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.
Amaro C++, il gusto pieno dell'undefined behavior.