2011-05-23 11 views
5

Se pregunta qué hace una declaración continue en un bucle do...while(false), me burlé de un simple análisis de los casos (pseudo-código):Continuar declaraciones

count = 0; 
do { 
    output(count); 
    count++; 
    if (count < 10) 
     continue; 
}while (false); 

output('out of loop'); 

La salida fue, para mi sorpresa:

0 
out of loop 

un poco confundido, he cambiado el bucle de una do...while a un for:

for (count = 0; count == 0; count++) { 
    output(count); 
    if (count < 10) 
     continue; 
} 
output('out of loop'); 

Aunque funcionalmente no es lo mismo, el propósito es prácticamente el mismo: hacer una condición solo satisfecha la primera iteración, y en las siguientes continuar (hasta que se alcance cierto valor, puramente para detener posibles bucles infinitos). Puede que no se ejecuten la misma cantidad de veces, pero la funcionalidad aquí no es lo importante.

La salida era el mismo que antes:

0 
out of loop 

Ahora, puesta en términos de un simple bucle while:

count = 0; 
while (count == 0) { 
    output(count); 
    count++; 
    if (count < 10) 
     continue; 
} 
output('out of loop'); 

Una vez más, la misma salida.

Esto es un poco confuso, ya que siempre he pensado en la declaración continue como "saltar a la próxima iteración". Entonces, aquí pregunto: ¿Qué hace una declaración continue en cada uno de estos bucles? ¿Simplemente salta a la condición?

((Por si sirve de algo, he probado lo anterior en JavaScript, pero creo que es independiente del idioma ... JS tuvieron que conseguir por lo menos ese derecho))

+0

@Brad & @Neil: Neil es correcto re: mi goof arriba. Me disparé en el pie. – abcd

Respuesta

5

En un bucle, continuará corre el 3ra expresión del enunciado for (usualmente usado como algún tipo de iteración), luego la condición (2da expresión), y luego el bucle si la condición es verdadera. No ejecuta el resto de la iteración actual del ciclo.

En un ciclo while (o do-while), simplemente ejecuta la condición y luego el ciclo si la condición se cumple. Tampoco ejecuta el resto de la iteración actual del ciclo.

1

Su definición de continue como "saltar a la siguiente iteración" es correcta. Esto forzará al programa a comenzar la próxima iteración por primero reevaluando la expresión condicional.

El problema con los fragmentos es que todos salen después de una iteración porque sus expresiones condicionales están configuradas en false o count ==0. Esto siempre devolverá falso después de una iteración.

Además, poner instrucción continue al final del ciclo no tiene sentido. Reevaluará la expresión condicional en cualquier caso.

0

continue salta a la siguiente iteración cuando se utiliza en un bucle. break sale del bloque actual. Normalmente, break se utiliza para salir de un bucle, pero se puede usar para salir de cualquier bloque.

for (int i = 0; i < 1000; i++) { 
    if (some_condition) { 
    continue; // would skip to the next iteration 
    } 

    if (some_other_condition) { 
    break; // Exits the loop (block) 
    } 

    // other work 
} 
1

Lo mejor es pensar en continue como saltar al final del bucle de cerramiento. Esto puede haelp:

#include <iostream> 
using namespace std; 

int main() { 

    int n = 0; 

    do { 
     cout << n << endl; 
     n += 1; 
     if (n == 3) { 
      continue; 
     } 
     cout << "n was not 3" << endl; 
    } while(n != 3); 

} 

que imprime:

0 
n was not 3 
1 
n was not 3 
2 

y termina, porque los saltos siguen el tiempo() al final del bucle. una rigidez similar ocurre para los bucles for() y while().