Bucles

Los bucles permiten repetir una serie de instrucciones un número de ocasiones mientras una condición se cumpla. En C tenemos el bucle WHILE, el bucle DO-WHILE y el bucle FOR.

Los bucles son una de las construcciones fundamentales en la programación estructurada, y nos permiten ejecutar un bloque de código repetidamente mientras se cumpla una condición determinada. Esto es especialmente útil para evitar escribir código repetitivo y para automatizar tareas que requieren iteraciones. Sin embargo, es crucial que la condición que controla el bucle deje de cumplirse en algún momento, porque si no, el bucle se ejecutará indefinidamente, lo que puede hacer que nuestro programa se cuelgue o incluso que el sistema deje de responder.

En el lenguaje C, nos encontramos con tres tipos principales de bucles: while, do while y for. Cada uno tiene su propia estructura y particularidades que nos permiten controlar la repetición de código de diferentes maneras.

El bucle while es el más sencillo y directo. Su sintaxis consiste en escribir la palabra while, seguida de una condición entre paréntesis, y luego el bloque de código entre llaves que queremos repetir. El funcionamiento es el siguiente: primero se evalúa la condición. Si esta es verdadera, se ejecuta el código dentro del bucle. Al terminar, se vuelve a evaluar la condición y, si sigue siendo verdadera, se repite el proceso. Esto continúa hasta que la condición deje de cumplirse, momento en el que el programa continúa con la siguiente instrucción fuera del bucle.

Por ejemplo, imaginemos que declaramos una variable k con valor inicial 10, y queremos imprimir su valor mientras sea menor que 20. Para evitar un bucle infinito, debemos asegurarnos de que la condición cambie en cada iteración. En este caso, incrementamos k en cada vuelta usando el operador posincremental k++. Así, el código sería:

int k = 10;
while (k < 20) {
    printf("%d\n", k);
    k++;
}
printf("Se ha salido del bucle\n");

Al ejecutar este código, veremos que se imprimen los números del 10 al 19, y cuando k llega a 20, la condición deja de cumplirse y el bucle termina.

El segundo tipo de bucle es el do while. Aunque su sintaxis incluye la palabra while, su comportamiento es diferente. En este caso, el bloque de código se ejecuta primero y luego se evalúa la condición. Esto significa que el código dentro del do while siempre se ejecuta al menos una vez, independientemente de si la condición es verdadera o no.

La estructura es la siguiente: escribimos do, luego el bloque de código entre llaves, y después la palabra while con la condición entre paréntesis, finalizando con un punto y coma. El ciclo se repite mientras la condición sea verdadera.

Un ejemplo similar al anterior sería:

int k = 10;
do {
    printf("%d\n", k);
    k++;
} while (k < 20);
printf("Se ha salido del bucle\n");

Aquí, el código imprime los valores de k desde 10 hasta 19, igual que en el while. Pero la diferencia clave es que si la condición nunca se cumple, el do while ejecutará el bloque al menos una vez.

Para ilustrar esta diferencia, podemos hacer un programa donde la condición nunca es verdadera, por ejemplo, con k inicializado en 20 y la condición k < 20. En el caso del while, el bloque no se ejecutará ni una sola vez, porque la condición se evalúa antes de entrar. En cambio, en el do while, el bloque se ejecutará una vez antes de evaluar la condición y salir.

Finalmente, el bucle for es muy útil cuando sabemos de antemano cuántas veces queremos repetir un bloque de código. Su sintaxis es un poco más compleja, pero muy poderosa. Se escribe for seguido de paréntesis que contienen tres partes separadas por punto y coma: la inicialización, la condición y la iteración. Después, entre llaves, va el código que queremos repetir.

El ciclo de vida del for es: primero se ejecuta la inicialización una sola vez, luego se evalúa la condición. Si es verdadera, se ejecuta el bloque de código. Al terminar, se ejecuta la iteración (normalmente un incremento o decremento de una variable), y se vuelve a evaluar la condición. Esto se repite hasta que la condición sea falsa.

Por ejemplo, para ejecutar un bloque cinco veces, podemos escribir:

for (int i = 0; i < 5; i++) {
    printf("Iteración %d\n", i);
}
printf("Se ha salido del bucle\n");

Aquí, declaramos la variable i dentro del for, lo que limita su alcance al bucle mismo. Esto es útil para evitar variables innecesarias en otras partes del programa. Sin embargo, esta forma de declarar variables dentro del for solo está disponible a partir del estándar C99. Si compilamos en modo ANSI C (C89), tendremos que declarar i antes del bucle.

En resumen, el for es ideal para iteraciones contadas, el while para repetir mientras una condición se mantenga verdadera, y el do while para ejecutar al menos una vez y luego repetir mientras la condición se cumpla. Entender estas diferencias nos permite elegir el bucle más adecuado para cada situación en nuestros programas en C.

Lista de reproducción
  1. 1
    Instalar CodeBlocks
    15 minutos
  2. 2
    Funciones y hola mundo
    17 minutos
  3. 3
    Variables y tipos de datos
    17 minutos
  4. 4
    Condicionales y operadores lógicos
    16 minutos
  5. 5
    Bucles
    11 minutos
  6. 6
    Punteros
    12 minutos
  7. 7
    Arrays
    14 minutos
  8. 8
    Estructuras
    12 minutos
  9. 9
    Otras construcciones de C
    9 minutos
  10. 10
    Memoria dinámica
    8 minutos
  11. 11
    El preprocesador (parte 1)
    10 minutos
  12. 12
    El preprocesador (parte 2)
    9 minutos
  13. 13
    Archivos de cabecera y múltiples .c (parte 1)
    8 minutos
  14. 14
    Archivos de cabecera y múltiples .c (parte 2)
    9 minutos
  15. 15
    C desde la línea de comandos (parte 1)
    8 minutos
  16. 16
    C desde la línea de comandos (parte 2)
    9 minutos
  17. 17
    Break y continue
    10 minutos
  18. 18
    Goto
    13 minutos
  19. 19
    Manipulación de bits
    15 minutos
  20. 20
    Máscaras de bit
    19 minutos
  21. 21
    Archivos (1): fopen y fclose
    13 minutos
  22. 22
    Archivos (2): leer con fgetc
    9 minutos
  23. 23
    Archivos (3): fseek y ftell
    11 minutos
  24. 24
    Archivos (4): leer con fgets
    9 minutos
  25. 25
    Archivos (5): fputc y fputs
    7 minutos
  26. 26
    Archivos (6): volcar en archivos con fwrite
    10 minutos
  27. 27
    Archivos (7): fread, fwrite y los arrays
    10 minutos
  28. 28
    Archivos (8): entrada estándar y salida estándar
    9 minutos
  29. 29
    Archivos (9): buffers
    14 minutos
  30. 30
    Archivos (y 10): otras funciones útiles con archivos
    5 minutos
  31. 31
    printf (1)
    18 minutos
  32. 32
    printf (parte 2)
    12 minutos
  33. 33
    scanf (parte 1)
    17 minutos
  34. 34
    scanf (parte 2)
    17 minutos
  35. 35
    fprintf, sprintf y snprintf
    8 minutos
  36. 36
    Tipos de datos opacos
    13 minutos
  37. 37
    Bibliotecas estáticas
    13 minutos
  38. 38
    Bibliotecas dinámicas
    15 minutos
  39. 39
    Más flags: i mayúscula (include), wall, werror, pedantic...
    12 minutos
  40. 40
    pkg-config
    12 minutos
  41. 41
    Make
    17 minutos
  42. 42
    GDB
    21 minutos
  43. 43
    Variables globales
    6 minutos
  44. 44
    extern
    9 minutos
  45. 45
    Funciones variádicas
    12 minutos
  46. 46
    El optimizador de GCC y la opción -O
    12 minutos
  47. 47
    Volatile
    6 minutos