Non solo è valida, struttura simile è stata utilizzato nel codice vero e proprio, per esempio, Duff's Device, che è un loop srotolato per la copia di un buffer:
send(to, from, count)
register short *to, *from;
register count;
{
register n = (count + 7)/8;
switch(count % 8) {
case 0: do { *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
} while(--n > 0);
}
}
da una dichiarazione switch
realtà solo calcola un indirizzo e salti ad esso, è facile capire il motivo per cui può sovrapporsi con altri strutture di controllo; le linee all'interno di altre strutture di controllo hanno anche indirizzi che possono essere bersagli da salto!
Nel caso in cui è stato presentato, immaginare se non ci fossero switch
o break
s nel codice. Quando hai terminato di eseguire la partedi una dichiarazione if
, continui a procedere, quindi cadrai nello case 2:
. Ora, dato che hai il switch
e il break
, è importante che cosa possa uscire da break
. Secondo la MSDN page, “The C break statement”,
La rottura dichiarazione termina l'esecuzione del più vicino racchiude fare, per, interruttore, o mentre dichiarazione in cui appare. Il controllo passa alla dichiarazione che segue l'istruzione terminata.
Dal momento che il più vicino che racchiude fare, per, interruttore, o mentre affermazione è la tua interruttore (si noti che se non è incluso in tale elenco), quindi se si' ri all'interno del blocco then
, si trasferisce all'esterno dell'istruzione switch
. Ciò che è un po 'più interessante, però, è che cosa succede se inserisci case 0
, ma c == 'A'
è falso. Quindi il if
trasferisce il controllo appena dopo la parentesi di chiusura del blocco then
e si inizia a eseguire il codice in case 2
.
Bene, questo è dovuto all'implementazione dispari 'goto label' di switch-case'. Anche se il tuo caso specifico è probabilmente un po 'strano e difficile da trovare in un caso d'uso (guarda [* Duff's Device *] (http://en.wikipedia.org/wiki/Duff%27s_device), però), il il concetto generale di casi di ricaduta (quando lasci la "pausa") può essere davvero molto utile. –
Nel caso in cui ora stiate cercando una spiegazione su come * il dispositivo Duff * funziona, [qui] (http://stackoverflow.com/questions/514118/how-does-duffs-device-work) alcuni sono. – devnull
In questo caso 'case 1:' viene trattato dal compilatore come un'etichetta separata. La sintassi è perfettamente valida, ma quasi certamente (dal contesto) un errore logico in questa situazione. Provalo inviando 'state == 1' a e vedrai il risultato errato. – Chad