2011-11-30 11 views
5

Nel codice seguente:Modifica variabile interruttore all'interno di un caso

int i = 0; 

switch(i) 
{ 
    case 0: 
     cout << "In 0" << endl; 
     i = 1; 
     break; 
    case 1: 
     cout << "In 1" << endl; 
     break; 
} 

Che cosa accadrà? Invocherà un comportamento indefinito?

+0

Perché dovrebbe? Se ti aspetti che 'case 1' venga eseguito da quando hai cambiato' i' su 1, non succederà neanche perché l'esecuzione raggiungerà la fine dell'istruzione 'switch' una volta che il' break' alla fine del 'caso 0' si incontra. – Praetorian

risposta

8

Nessun comportamento non definito. Ma il valore di i viene testato solo quando il codice raggiunge switch (i). Quindi verrà saltato (dall'istruzione break;).

La parola chiave switch non significa "codice di esecuzione quando il valore di i è 0/1". Significa, controlla cosa i è GIUSTO ORA ed esegui il codice basato su quello. Non importa cosa succede a i in futuro.

Infatti, a volte è utile fare:

for(step = 0; !cancelled; ++step) { 
    switch (step) 
    { 
     case 0: 
      //start processing; 
      break; 

     case 1: 
      // more processing; 
      break; 

     case 19: 
      // all done 
      return; 
    } 
} 

E cambiando la variabile di controllo in un blocco case è estremamente comune quando si costruisce una macchina a stati finiti (anche se non richiesto, perché è possibile impostare next_state all'interno case e successivamente eseguire l'assegnazione state = next_state).

0

Si si interrompe fuori da questa istruzione switch dopo averlo impostato su 1 che è un comportamento definito, quindi non entrerà mai in case 1.

+2

Il comportamento sarebbe ancora ben definito (ma diverso) senza il 'break'. –

+0

Sì, verrebbe quindi eseguito e stampato entrambi, senza alcuna relazione al fatto che il valore successivo è il caso 1. – Joe

1

Nessun problema qui. L'espressione nella condizione dell'interruttore viene valutata quando viene raggiunta. Non deve essere una variabile e se è la variabile può essere successivamente modificata senza alcun effetto sul comportamento dell'istruzione switch.

0

L'output sarà:

"In 0"

anche se si assegna il valore i = 1 è solito essere riflessa perché accensione non è in iterazione, è una selezione del tempo pausa farebbe fallo uscire dall'istruzione switch.

Problemi correlati