En el lenguaje C, hay tres estructuras cíclicas principales: for, while y do-while. Su aparición está relacionada con la necesidad de realizar cálculos repetidos, facilitar el recorrido de estructuras de datos y automatizar el procesamiento de arreglos. La sintaxis de los ciclos apareció por primera vez en lenguajes de programación tempranos (Algol, Fortran) y fue adaptada al syntax de C para mejorar la legibilidad y el control del flujo.
Historia de la cuestión
Inicialmente, los programadores utilizaban etiquetas y goto para organizar acciones repetidas, lo que rápidamente llevaba a un código enredado (spaghetti code). La introducción de ciclos estructurados (en C — desde 1972) permitió unificar el enfoque hacia la repetición y la descripción de la lógica de los programas.
Problema
La tarea principal de los ciclos es definir cuántas veces debe repetirse una acción determinada y cómo controlar la salida del ciclo. Es importante elegir correctamente el tipo de ciclo según si se sabe de antemano el número de repeticiones, si se requiere ejecutar el cuerpo al menos una vez y si es necesario calcular de antemano la condición de salida.
Solución
Ejemplo de código:
#include <stdio.h> int main() { int i = 0; // Ejemplo de ciclo while while (i < 3) { printf("while: %d\n", i); i++; } // Ejemplo de ciclo for for (int j = 0; j < 3; j++) { printf("for: %d\n", j); } // Ejemplo de ciclo do-while int k = 0; do { printf("do-while: %d\n", k); k++; } while (k < 3); return 0; }
Características clave:
¿Cuál es la diferencia entre while(1) y for(;;) y cuál de ellos es mejor usar para un ciclo infinito?
Respuesta: Ambas opciones crean un ciclo infinito y se traducen en el mismo código máquina, no hay diferencia en rendimiento. Normalmente se utiliza for(;;) para mostrar explícitamente que no se espera inicialización, condición de salida ni paso.
for(;;) { // ciclo infinito } // o while(1) { // ciclo infinito }
¿Se puede cambiar la variable del ciclo dentro del cuerpo de for y qué pasará?
Respuesta: Cambiar la variable del contador (por ejemplo, i++) dentro del cuerpo del ciclo for conducirá a un número impredecible de iteraciones. Tales cambios confunden a los lectores y dificultan la depuración.
for (int i = 0; i < 10; i++) { printf("%d\n", i); i += 2; // cambio no estándar del paso! }
¿Qué pasará si se deja vacío el cuerpo del ciclo? ¿En qué casos tiene sentido?
Respuesta: Un cuerpo vacío de ciclo es permitido y se utiliza para esperar la ocurrencia de un evento o preparar datos:
while(*src++ = *dst++); // copia de la cadena hasta el símbolo '\0'
Caso negativo
En un proyecto se utilizó for con cambio de la variable del contador dentro del cuerpo, lo que llevó a un número incorrecto de elementos procesados, errores y dificultades en la depuración.
Ventajas:
Desventajas:
Caso positivo
Uso de for para recorrer un arreglo de longitud fija sin cambiar el contador desde afuera:
Ventajas:
Desventajas: