Bucle for vs while en C++: ¿cuál y cuándo?
Respuesta corta: usa for cuando sabes cuántas veces repetir (o recorres un contador); usa while cuando repites hasta que algo ocurra y no puedes saberlo por adelantado. Técnicamente ambos hacen el trabajo del otro — la elección va de legibilidad.
El bucle for: contar cosas
Un encabezado for tiene tres partes — inicio; condición de continuación; paso — lo que vuelve «haz esto 10 veces» legible de un vistazo:
#include <iostream>
using namespace std;
int main() {
int sum = 0;
for (int i = 1; i <= 10; i++) {
sum += i;
}
cout << "1 + 2 + ... + 10 = " << sum << endl;
return 0;
}
Leído en voz alta: empieza con i = 1; sigue mientras i <= 10; tras cada vuelta, i++. La variable i solo vive dentro del bucle — usarla después es error de compilación, y eso es bueno.
El bucle while: hasta que algo pase
Un while solo tiene condición. Caso clásico: leer entrada hasta un valor de parada (un «centinela»). Pon números en la caja de entrada — el 0 detiene el bucle:
#include <iostream>
using namespace std;
int main() {
int x, sum = 0;
cin >> x;
while (x != 0) {
sum += x;
cin >> x;
}
cout << "sum = " << sum << endl;
return 0;
}
Fíjate en la estructura: se lee una vez antes del bucle y otra al final del cuerpo. Olvidar esa segunda lectura es un bug de principiante clásico — convierte el bucle en infinito.
do-while: correr al menos una vez
La condición se comprueba después del cuerpo, así que este siempre corre al menos una vez — ideal para menús y «preguntar hasta que sea válido»:
#include <iostream>
using namespace std;
int main() {
int n = 3;
do {
cout << "countdown: " << n << endl;
n--;
} while (n > 0);
cout << "liftoff" << endl;
return 0;
}
break y continue
break sale del bucle al instante; continue se salta el resto de esta vuelta y pasa a la siguiente:
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) continue; // saltar pares
if (i > 7) break; // parar tras 7
cout << i << " ";
}
cout << endl;
return 0;
}
Lado a lado
| for | while | do-while | |
|---|---|---|---|
| Condición comprobada | Antes de cada vuelta | Antes de cada vuelta | Después de cada vuelta |
| Mínimo de ejecuciones | 0 | 0 | 1 |
| Ideal para | Conteo conocido, contadores | Conteo desconocido, «hasta que ocurra» | Menús, validar entrada |
Los bugs clásicos (memorízalos, ahorra horas)
- Punto y coma tras el encabezado:
for (int i = 0; i < 10; i++);— ese;suelto es un cuerpo vacío: el bucle da diez vueltas sin hacer nada. Igual conwhile (...);. - Off-by-one:
i <= 10corre 10 veces para 1..10;i < 10corre 9. Ninguno es «incorrecto» — pero elige a conciencia y revisa el borde al depurar. - Bucle infinito: olvidar
i++, o actualizar la variable dentro pero no volver a leer. Aviso de este sitio: el editor corre en tu navegador, así que un bucle desbocado congelará la pestaña hasta que la cierres — revisa el paso antes de pulsar Ejecutar. - Modificar el contador dentro del for — legal pero confuso; si el cuerpo cambia
i, el encabezado le está mintiendo al lector.
El clásico de entrevistas: FizzBuzz
Preguntado sin parar en cribas junior — en realidad examina bucles, % y el orden de los if. Reglas: múltiplos de 3 imprimen "Fizz", de 5 "Buzz", de ambos "FizzBuzz", y si no el número:
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 15; i++) {
if (i % 15 == 0) cout << "FizzBuzz";
else if (i % 3 == 0) cout << "Fizz";
else if (i % 5 == 0) cout << "Buzz";
else cout << i;
cout << " ";
}
cout << endl;
return 0;
}
La trampa: comprobando i % 3 primero, el 15 imprimiría "Fizz" y nunca llegaría a "FizzBuzz" — el orden importa. Y si el 15 % 3 o el % con negativos aún te bailan, esa es la guía de división entera.
Práctica
- Imprime la tabla del 5 (1×5 a 10×5) con un
for. - Rehazla con
while— misma salida, otro encabezado. - Lee números hasta uno negativo e imprime la media (ojo:
sum / countte morderá — mira por qué).
Relacionado: qué es int main() y la lista de preguntas para juniors.