Con qué frecuencia se usa la instrucción goto en C?

R

Todavía estoy aprendiendo C. Descubrí que el comando goto se puede usar para salir de todos los bucles anidados a la vez. También descubrí que no se usa mucho en C. Sin embargo, lo uso regularmente porque creo que es bastante útil y, a veces, es mucho más fácil que las opciones típicas. En lugar de usar un ciclo, usé una instrucción goto en mi pequeño programa para remediar el error del usuario.

#include <stdio.h>
#include <stdlib.h>

int main()
{
    /*A program to store a number in 4 bits only !*/
    printf("Enter x then z :\n");
    int x, y;
    Start:
    scanf("%d %d", &x, &y);
    if((x > 15) || (y > 15) || (x < 0) || (y < 0))
    {
        printf("Wrong numbers! : 0<= x,y <=15\n");
        printf("Enter the numbers again : \n");
        goto Start;
    }
    char z;
    x<<= 4;
    z = x + y;
    printf("z = %d", z);
    return 0;
}

Entonces, mi preocupación es, ¿debería dejar de usarlo por completo? Este blog de scaler topics propuso usar goto solo cuando el uso de alternativas haría que el código fuera más feo o, en situaciones extremas, peor. ¿Es esto correcto?

-Yepeto-

En ese caso yo usaría un do while, creo que quedaría más claro. Con el goto tienes que estar mirando donde está el label al que le dices de ir.

Soltrac

Welcome to BASIC, i will be your guide.

Z3R0KULL

no te recomendaría el uso de goto porque si luego vas a programar en otros lenguajes, esto no existe. Es mejor que te acostumbres a usar do-while, while, for, switch etc... y asi te sentirás luego más cómodo en otros lenguajes

djamb

No se debe de usar nunca, es un vestigio de cuando los lenguajes no tenían bucles y se iba a una línea o etiqueta..
Usa bucles, funciones o lo que corresponda para que lo que programes sea lo más legible, independiente, estructurado y desacoplado.

3
desu
#1RickRio78:

¿debería dejar de usarlo por completo?

La recomendacion general es no usarlo.

Cada vez que te encuentres con un break, continue o que quieras hacer un goto lo puedes resolver utilizando una funcion.

Leer el codigo con esas funciones es mas leible para la mayoria de gente.

#1RickRio78:

Es esto correcto?

Se usa bastante gotos en algunos algoritmos. Se suele usar porque te permite tener mayor control sobre el assembly que generas. Tambien hay muchos algoritmos que es mucho mas facil escribirlos con tags para saltar.

En tu caso te lo arreglo, usa bool, usa shorts, us %hu y usa do/while:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

bool is_invalid_input(short, short);

int main() {
   short x, y;

do {
    printf("Enter two numbers n, where 0 <= n <= 15:\n");
    scanf("%hu %hu", &x, &y);
} while(is_invalid_input(x, y));


x <<= 4;

short z = x + y;

printf("z = %hu", z);

return 0;
}

bool is_invalid_input(short x, short y) {
    return (x > 15) || (y > 15) || (x < 0) || (y < 0);
}

Si tus funciones son muy costosas llamarlas, te joden el assembly, cuesta optimizarlas con flags al compilador, entonces hay que usar gotos/tags.

1 1 respuesta
sergioRG

#6 Existe bool en C? Diria que es de C++
El <<= 4 si usas short y %hu sigue haciendo falta? O estoy mezclando cosas?

En algunos códigos del paleolítico los he visto para hacer frees de cosas que solo se allocatan bajo determinadas circunstancias, pero me sigue pareciendo bastante sustituible por otras alternativas tipo tener flags, refactorizar a otras funciones etc

También se usa mucho en C para microcontroladores, en los que aunque estés escribiendo en C te interesa que una determinada línea de código se ejecute en exactamente un cierto estado, por ejemplo flags de algún registro y similares.

Pero en general diría que es bastante evitable.

Es bastante herencia de assembler, en el que puedes escribir con labels y jmps a dichas labels

1 respuesta
desu
#7sergioRG:

Existe bool en C?

Si, _Bool desde C99 y tienes stdbool.h

Yo uso siempre:

#7sergioRG:

El <<= 4 si usas short y %hu sigue haciendo falta? O estoy mezclando cosas?

Estas mezclando.

x = 0000 0001, x = 1 en decimal
x <<= 4 , shift 4 bits
x = 0001 0000, x = 16 en decimal

Si la tecnica del free es muy usada. De hecho se usa para hacer VMs o GC simples o RAII

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr = (int*) malloc(1 * sizeof(int));
    if(ptr == NULL) {
        goto free_memory;
    }

printf("Success! memory allocated.");
return 0;
free_memory:
    free(ptr);
    printf("Error! memory not allocated.");
    return -1;
}

Algo asi, cada vez que alocas te guardas el puntero y al final tienes un tag donde iteras todos los punteros y los liberas.

"Esta tecnica" hasta la usamos en cosas con GC como Golang o Java para la gestion de recursos. Por ejemplo cerrar fds si falla algo.

3
werty

pues yo diría que se usa lo suyo no?

yo tengo acceso a código programa, escrito en principio de los 90 y está lleno de goto:

err = funcion( parametros)
if err!==Null
goto funcion_salida

Usuarios habituales