Este sitio web usa cookies de terceros para analizar el tráfico y personalizar los anuncios. Si no está de acuerdo, abandone el sitio y no siga navegando por él. ×


3.6. Saltos incondicionales: goto

El lenguaje C también permite realizar saltos incondicionales, utilizando la orden "goto". Su uso indisciplinado está muy mal visto, porque puede ayudar a hacer programas llenos de saltos, difíciles de seguir.

El formato de "goto" es

goto etiqueta;

y la posición de salto se indica con "una etiqueta", una palabra seguida de un símbolo de dos puntos (:)

etiqueta:

como en el siguiente ejemplo, que escribe "Pasada 1", "Pasada 2" y así sucesivamente hasta que se detenga la ejecución cerrando la ventana del programa, porque el salto incondicional hacia un punto anterior crea un "bucle sin fin":

/*  ej030601.c                 */
/*  "goto": saltos sin fin     */
/*  Ejemplo del apartado 3.6   */
/*  Curso de C, Nacho Cabanes  */

#include 

int main()
{
    int salto = 1;

    repetir:
    printf("Pasada %d; ", salto);
    salto++;
    goto repetir;

    return 0;
}

En casos concretos, "goto" puede ser muy útil, por ejemplo, para salir de un bucle muy anidado (un "for" dentro de otro "for" que a su vez está dentro de otro "for": en este caso, "break" sólo saldría del "for" más interno, no del externo).

/*  ej030602.c                 */
/*  "for" y "goto"             */
/*  Ejemplo del apartado 3.6   */
/*  Curso de C, Nacho Cabanes  */

#include 

int main()
{
    int i, j;

    for (i=0; i<=5; i++)
        for (j=0; j<=20; j+=2)
        {
            if ((i==1) && (j>=7)) 
                goto salida;
            printf("i vale %d y j vale %d.\n", i, j);
        }

    salida:
        printf("Fin del programa\n");

    return 0;
}

El resultado de este programa es:

  i vale 0 y j vale 0.
  i vale 0 y j vale 2.
  i vale 0 y j vale 4.
  i vale 0 y j vale 6.
  i vale 0 y j vale 8.
  i vale 0 y j vale 10.
  i vale 0 y j vale 12.
  i vale 0 y j vale 14.
  i vale 0 y j vale 16.
  i vale 0 y j vale 18.
  i vale 0 y j vale 20.
  i vale 1 y j vale 0.
  i vale 1 y j vale 2.
  i vale 1 y j vale 4.
  i vale 1 y j vale 6.
  Fin del programa

Vemos que cuando i=1 y j>=7, se sale de los dos "for", mientras que el programa "casi equivalente" que emplea "break" no se comporta igual, sino que continúa y da todas las pasadas para i=2, i=3, i=4 e i=5.

/*  ej030603.c                 */
/*  "break" en vez de "goto"?  */
/*  Ejemplo del apartado 3.6   */
/*  Curso de C, Nacho Cabanes  */

#include 

int main()
{
    int i, j;

    for (i=0; i<=5; i++)
        for (j=0; j<=20; j+=2)
        {
            if ((i==1) && (j>=7)) 
                break;
            printf("i vale %d y j vale %d.\n", i, j);
        }
    
    printf("Fin del programa\n");

    return 0;
}