Break y continue

Break y continue son dos instrucciones que podemos usar en bucles para manipular el flujo de ejecución de las iteraciones de nuestros bucles. Aunque corren el riesgo de complicar el código, a veces son lo suficientemente concisos y limpios como para justificar su uso.

Cuando trabajamos con bucles en C, a menudo necesitamos controlar el flujo de ejecución de manera más precisa que simplemente dejar que el bucle recorra todas sus iteraciones. Para ello, contamos con instrucciones como continue y break, que nos permiten saltar ciertas partes del bucle o terminarlo anticipadamente, respectivamente. Además, existe la instrucción goto, que aunque tiene mala fama, puede ser útil en ciertos casos.

Empecemos por continue. Esta instrucción se utiliza dentro de bucles para saltar el resto del código en la iteración actual y pasar directamente a la siguiente. Por ejemplo, imaginemos que tenemos un array con diez valores y queremos imprimir solo los números pares. Una forma común sería usar un if que compruebe si el número es par y, en caso afirmativo, imprimirlo. Pero si la condición se complica, con múltiples criterios anidados, el código puede volverse difícil de leer y mantener.

Aquí es donde continue nos ayuda a simplificar la lógica. En lugar de anidar múltiples if, podemos preguntar por la condición contraria y, si no se cumple, usar continue para saltar a la siguiente iteración. Esto hace que el código sea más claro, porque evitamos niveles profundos de indentación y dejamos explícito cuándo no queremos procesar un elemento.

Veamos un ejemplo sencillo en C que imprime solo los valores pares de un array:

#include <stdio.h>

int main() {
    int valores[] = {5, 14, 9, 6, 11, 19, 14, 17, 6, 9};
    int n = 10;

    for (int i = 0; i < n; i++) {
        if (valores[i] % 2 != 0) {
            continue; // Saltamos los impares
        }
        printf("valor de %d es igual a %d\n", i, valores[i]);
    }

    return 0;
}

En este código, cuando el valor no es par, el continue hace que el bucle pase directamente a la siguiente iteración, evitando ejecutar el printf.

Sin embargo, hay que tener cuidado con el uso de continue, ya que altera el flujo natural de ejecución y puede dificultar la comprensión del código si se usa en exceso o en lugares poco claros. Lo ideal es usarlo para hacer comprobaciones al principio de la iteración y decidir si continuar o no.

Por otro lado, break es una instrucción que termina la ejecución del bucle por completo, saliendo de él. Esto es útil cuando queremos detener un bucle antes de que termine todas sus iteraciones, por ejemplo, cuando encontramos un valor que nos interesa o cuando queremos implementar una condición de salida.

Un caso típico es un bucle infinito que espera la entrada del usuario y termina cuando se introduce un valor específico, como cero. Por ejemplo:

#include <stdio.h>

int main() {
    int valor;

    while (1) { // Bucle infinito
        printf("Introduce un número (0 para salir): ");
        scanf("%d", &valor);

        if (valor == 0) {
            break; // Salimos del bucle si el valor es cero
        }

        printf("Has insertado %d\n", valor);
    }

    printf("Programa terminado.\n");
    return 0;
}

Aquí, el break permite salir del bucle infinito cuando el usuario introduce cero, evitando que el programa se quede atrapado en un ciclo sin fin.

Es importante recordar que break no se puede usar para salir de estructuras como if o else, sino que está diseñado para salir de bucles (for, while, do while) y de switch. Por eso, a veces hay confusión sobre su comportamiento.

Finalmente, mencionamos brevemente la instrucción goto. Aunque tiene mala reputación por poder generar código difícil de seguir y mantener, en ocasiones puede ser útil para salir de múltiples niveles de anidación o para manejar errores de forma sencilla. Sin embargo, su uso debe ser muy cuidadoso y justificado, ya que puede complicar la lógica del programa si se abusa de ella.

En resumen, continue y break son herramientas poderosas para controlar el flujo dentro de bucles en C. Usándolas con criterio, podemos escribir código más claro y eficiente, evitando anidaciones excesivas y facilitando la gestión de condiciones especiales dentro de nuestras iteraciones.

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