El bucle while de C++, explicado
Respuesta corta: un bucle while repite su cuerpo mientras una condición es verdadera, y la comprueba antes de cada pasada. Es el bucle para «aún no sé cuántas veces» — todo lo demás es un for disfrazado.
Un bucle while tiene tres piezas, y solo la primera forma parte de la sintaxis:
- Condición — se comprueba antes de cada pasada; si es falsa, el bucle termina.
- Cuerpo — el trabajo.
- Actualización — algo dentro del cuerpo debe hacer que la condición deje de cumplirse. Si lo olvidas, tienes un bucle infinito.
Cuenta atrás: el ejemplo mínimo
#include <iostream>
using namespace std;
int main() {
int n = 5;
while (n > 0) {
cout << n << " ";
n--; // la actualización — quítala y el bucle no termina
}
cout << endl;
return 0;
}
Donde while brilla (1): desmenuzar un número en dígitos
Cuando no sabes cuántos dígitos tiene un número, un for resulta incómodo y un while es lo natural. Este ejemplo suma los dígitos de 12345 (el patrón que hay detrás de nuestro problema de práctica Suma de los dígitos):
#include <iostream>
using namespace std;
int main() {
int n = 12345;
int sum = 0;
while (n > 0) {
sum += n % 10; // último dígito
n /= 10; // lo elimina — mira por qué 12345/10 es 1234 en nuestra
// guía de división entera
}
cout << sum << endl; // 15
return 0;
}
Donde while brilla (2): leer hasta un centinela
Lee números hasta que el usuario escriba 0. La cantidad es desconocida — ese es territorio de while (los números van en el campo de entrada):
#include <iostream>
using namespace std;
int main() {
int x, sum = 0;
cin >> x;
while (x != 0) {
sum += x;
cin >> x; // vuelve a leer DENTRO del bucle
}
cout << "sum = " << sum << endl;
return 0;
}
Una variante más elegante actúa directamente sobre la propia lectura — cin >> x se evalúa como el flujo, que se convierte en verdadero mientras las lecturas siguen funcionando, así que el bucle termina al final de la entrada o cuando una lectura falla:
#include <iostream>
using namespace std;
int main() {
int x, sum = 0;
while (cin >> x) { // repite mientras la lectura tiene éxito
sum += x;
}
cout << "sum = " << sum << endl;
return 0;
}
Anatomía de un bucle infinito
int n = 5;
while (n > 0) {
cout << n << " ";
// olvidaste n--; → la condición nunca se vuelve falsa
}
Tres causas clásicas: no actualizar nada, una actualización que se salta la salida (n-- desde 5 con la condición n == 0) y una lectura que ocurre fuera del bucle. En este sitio, un bucle desbocado congela la pestaña del navegador (el código se ejecuta en tu dispositivo) — así que revisa dos veces la línea de actualización antes de pulsar Ejecutar. Una sentencia break; es una salida de emergencia, pero un bucle del que solo puedes salir con break suele indicar un mal diseño.
Errores habituales de principiante
- Punto y coma después de la condición:
while (n > 0);— ese;suelto es un cuerpo vacío; el bucle o gira para siempre o no hace nada. - Desfase de uno en la condición:
>frente a>=. Traza una iteración a mano con una entrada pequeña. - Actualizar la variable equivocada — ir dividiendo
copymientras compruebasn, o al revés.
Preguntas de entrevista sobre while
- «¿Cuándo eliges
whileen lugar defor?» — cuando el número de iteraciones se desconoce de antemano: lecturas con centinela, procesamiento de dígitos, esperar una condición. - «¿Qué significa
while (cin >> x)?» — el flujo se convierte en verdadero mientras las lecturas tienen éxito; el bucle termina al final de la entrada o con una entrada inválida. - «¿Diferencia entre
whileydo-while?» —do-whilecomprueba la condición después del cuerpo, así que siempre se ejecuta al menos una vez (menús, validación de entrada). - «¿Cómo depurarías un bucle infinito?» — imprime las variables del bucle en cada pasada; la variable que nunca cambia es la actualización que te falta.
Ponlo en práctica
Estos problemas de nuestra sección de práctica son territorio de bucles while: Contar dígitos, Suma de los dígitos, ¿Es primo?. Y la pieza que los acompaña: for vs while, lado a lado.