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

forwhiledo-while
Condición comprobadaAntes de cada vueltaAntes de cada vueltaDespués de cada vuelta
Mínimo de ejecuciones001
Ideal paraConteo conocido, contadoresConteo desconocido, «hasta que ocurra»Menús, validar entrada

Los bugs clásicos (memorízalos, ahorra horas)

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

  1. Imprime la tabla del 5 (1×5 a 10×5) con un for.
  2. Rehazla con while — misma salida, otro encabezado.
  3. Lee números hasta uno negativo e imprime la media (ojo: sum / count te morderá — mira por qué).

Relacionado: qué es int main() y la lista de preguntas para juniors.