2012-08-31 11 views
7

Cosa succede quando si interrompono i cicli annidati?interruzione del ciclo while

supporre il seguente codice:

for(int x = 0; x < 10; x++) 
{ 
    do { 
     if(x == 4) 
      break; 
     x++; 
    } while(x != 1); 
} 

Quale anello uscirà sul incontrando l'istruzione break, il ciclo o il fai while?

+6

'break' sarà solo uscire dal ciclo interno –

+0

uscirà il fare/mentre, se si desidera esci dal ciclo OUTER dovrai eseguire il rollout con un'istruzione goto ... – Shark

+2

Puoi interrompere il ciclo esterno in diversi modi. Puoi 'goto', puoi' return', puoi impostare 'x = 10;', e così via. –

risposta

6

Il break interrompe sempre il ciclo più interno.

6.8.6.3

Un'istruzione break termina l'esecuzione del più piccolo interruttore o iterazione economico.


Se si vuole uscire da entrambi i loop, utilizzare un'etichetta dopo la for e saltare con goto.

+0

Grazie, ma goto era esattamente la cosa che stavo cercando di evitare, è un po 'brutto ma questa è la mia opinione. sebbene assomigli da vicino all'esecuzione condizionale in assemblea con rami. – sgupta

+0

@ user1075375 Mi piace goto. Capisco che sia una cattiva forma in C++ e non discuterò. Ma in C è abbastanza bello :-) – cnicutar

+0

Metti una condizione extra nel ciclo for che non sarà vero quando vuoi uscire da esso? – teppic

0

Break interromperà il ciclo più vicino/più interno che contiene la pausa. Nel tuo esempio, l'interruzione ucciderà il do-while e il controllo salterà sul ciclo for(), e semplicemente inizierà la successiva iterazione di for().

Tuttavia, dal momento che si modifica x sia nei cicli do() AND for(), l'esecuzione sarà un po 'instabile. Produrre un ciclo infinito una volta che la X esterna raggiunge 5.

+0

il codice era pensato solo per il gusto di farlo. – sgupta

0

il tempo si interromperà e il ciclo for continuerà a funzionare.

4

In alternativa, è possibile utilizzare una bandiera se non si desidera utilizzare goto:

int flag = 0; 

for(int x = 0; x < 10; x++) 
{ 
    do { 
     if(x == 4) { 
      flag = 1; 
      break; 
     } 
     x++; 
    } while(x != 1); 

if(flag) 
    break; // To break the for loop 
} 
+0

considerando lo spreco di 4 byte nella cache e il ciclo di controllo condizionale extra, goto sembra un migliore intervallo di prestazioni. Ancora di più dal momento che mi aspetto che il ciclo venga eseguito molte volte. – sgupta

+1

Se si fosse dopo la performance, non si scriverebbe questo codice in primo luogo. Non c'è bisogno di avere il ciclo for esterno, se si sta per interrompere quando si arriva a un valore particolare. – Floris

+0

Questo non è il codice che ho scritto, era semplicemente a scopo illustrativo per aiutare le persone a capire cosa intendevo. – sgupta