2012-05-14 15 views
8

simple pregunta en relación con el código C++:break; C++: bucle que es lo que realmente romper

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; 
     } 
    } 
} 

Quiero asegurar que

  • Cada línea de double **simplex se inserta como máximo una vez en double **bestList
  • La instancia de break aquí se rompe del segundo bucle (interno) for.

¿Es este el caso?

+0

Sí, es salir del segundo bucle 'for'. –

+1

La sentencia 'break' SIEMPRE ocurrirá si' funcEvals [i]

+3

'break' siempre se rompe de la estructura más interna (loop o' switch') activa en ese punto del código (en este caso, el 'for (j ...' loop). –

Respuesta

28

La declaración de interrupción en C++ se saldrá de la instrucción para o cambiar en la que se coloca el corte directamente. Rompe la estructura más interna (lazo o interruptor). En este 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 
    } 

No hay forma en que C++ tenga un objetivo de ruptura en ningún otro ciclo. Para salir de los bucles padres, debe usar algún otro mecanismo independiente, como activar la condición final.

Además, si desea salir de más de un bucle interno, puede extraer esos bucles en una función. En C++ 11 se pueden usar lambdas para hacerlo en el lugar, por lo que no será necesario usar goto.

+1

A menudo se puede usar una etiqueta y 'goto' para salir de otros bucles. –

+5

Generalmente me resulta más práctico poner este tipo de cosas en una función llamada algo así como 'findFirstElemThatXYZ' y luego regresar cuando lo encuentre. – Dennis

4

La declaración break en C++ estallará de la declaración for o switch en la que el break se coloca directamente. En este caso, saldrá del bucle for (int j = ....

No hay forma en C++ de tener break dirigirse a cualquier otro ciclo. Para salir de los bucles padres, debe usar algún otro mecanismo independiente, como activar la condición final.

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

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

No se olvide de goto, excepciones y longjmp :) – sehe

+0

configuración 'i = npts' para romper el ciclo es confuso, utilice un booleano en su lugar. –

+1

@MooingDuck mi ejemplo está diseñado para ser mínimamente invasivo para la muestra de OP. – JaredPar

3

Usted está saliendo de su segundo bucle en su primer bucle.

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

También podemos establecer un valor lógico en la parte superior

bool shouldBreak = false; 

y cuando se escribe descanso, escribir

shouldBreak = true; 
break; 

Luego, al final de su bucle, comprobar cada vez,

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

puede establecer un valor lógico en la parte superior

bool shouldBreak = false; 

y cuando usted quiere romper el otro bucle, escribir

shouldBreak = true; 
break; 
Cuestiones relacionadas