2012-05-14 9 views
8

semplice domanda riguardante codice C++:interruzione; C++: quale ciclo è effettivamente rottura

for(int i=0;i<npts;i++) 
{ 
    for(int j=i;j<2*ndim;j++) 
    { 
     if(funcEvals[i]<bestListEval[j]) 
     { 
      bestListEval[j] = funcEvals[i]; 
      for(int k=0;k<m_ndim;k++) 
       bestList[j][k] = simplex[i][k]; 
      break; 
     } 
    } 
} 

voglio assicurare che

  • Ogni linea di double **simplex è inserito più di una volta in double **bestList
  • L'istanza di break qui si interrompe il secondo ciclo (interno) for.

È questo il caso?

+0

Sì, si sta uscendo del secondo 'ciclo for'. –

+1

L'istruzione 'break' si verificherà SEMPRE se' funcEvals [i]

+3

'break' interrompe sempre la struttura più interna (loop o' switch') attiva in quel punto nel codice (in questo caso il 'for (j ...' loop). –

risposta

28

L'istruzione break in C++ verrà interrotta dall'istruzione for o switch in cui viene inserita direttamente l'interruzione. Rompe la struttura più interna (loop o switch). In questo caso:

for(int i=0;i<npts;i++) 
    { 
     for(int j=i;j<2*ndim;j++) 
     { 
      if(funcEvals[i]<bestListEval[j]) 
      { 
       bestListEval[j] = funcEvals[i]; 
       for(int k=0;k<m_ndim;k++) 
        bestList[j][k] = simplex[i][k]; 
       break; 
      } 
     } 
     // after the 'break' you will end up here 
    } 

Non c'è modo in C++ per avere bersaglio pausa qualsiasi altro circuito. Per uscire dai loop parent è necessario utilizzare un altro meccanismo indipendente come l'attivazione della condizione finale.

Inoltre, se si desidera uscire da più di un loop interno è possibile estrarre i loop in una funzione. In C++ 11 è possibile utilizzare lambda per farlo sul posto, quindi non sarà necessario utilizzare goto.

+1

Spesso un'etichetta e un 'goto' possono essere usati per uscire da altri loop. –

+5

Generalmente trovo più comodo mettere questo tipo di cose in una funzione chiamata qualcosa come "findFirstElemThatXYZ" e poi tornare quando lo trovo. – Dennis

4

Il break dichiarazione in C++ scoppierà della dichiarazione for o switch in cui il break è posto direttamente. In questo caso si romperà dal ciclo for (int j = ....

In C++ non c'è modo di avere come target break nessun altro ciclo. Per uscire dai loop parent è necessario utilizzare un altro meccanismo indipendente come l'attivazione della condizione finale.

// Causes the next iteration of the 'for (int i ...' loop to end the loop) 
i = npts; 

// Ends the 'for (int j ...' loop 
break; 
+0

Non dimenticarti di goto, eccezioni e longjmp :) – sehe

+0

l'impostazione 'i = npts' per interrompere il ciclo è confusa, usa invece un booleano. –

+1

@MooingDuck il mio esempio è progettato per essere minimamente invasivo per il campione dell'OP. – JaredPar

3

Stai uscendo dal secondo ciclo fino al primo ciclo.

for (int i=0; i<npts; i++) 

È possibile impostare un valore booleano in cima

bool shouldBreak = false; 

e quando si scrive pausa, scrivere

shouldBreak = true; 
break; 

Poi, alla fine del ciclo, controllare ogni volta,

if (shouldBreak) break; 
-1
for (int i = 0; i < npts; i++) 

è possibile impostare un valore booleano in cima

bool shouldBreak = false; 

e quando si vuole rompere l'altro ciclo, scrivere

shouldBreak = true; 
break;