Yo recuerdo que la "buena programación" no debia utilizar
goto porque desvirtua todo tipo de algoritmo, en cuanto a
break,
continue, etc... está permitido. Además, conceptualmente: funciona

Paso a explicarme:
Porque los programadores experimentados
1 prefieren no usar goto?
Facil, porque la depuración se compara con un paseo por el infierno cuando se trabaja con sistemas de gran envergadura, con procedimientos de muchas lineas y complejos de interpretar. Desde ese punto de vista estoy de acuerdo que la practica de usar goto no es aconsejable, simplemente se podria usar en algoritmos pequeños, pero... eso podria llevar a acostumbrarse, lo cual
realmente no es bueno. Pocas veces trabajamos con algoritmos de menos de 20 lineas. Entonces...
Que impide reescribir el algoritmo sin utilizar goto? Absolutamente nada.
Solo se necesita conocer todas las herramientas del lenguaje, y pensar en forma estructurada, siempre siguiendo un hilo de ejecución lineal
2.
Entonces porque no está mal visto el uso de
break o
continue?
Por dos motivos a mi entender.
Es cuestión de pensar el metalenguaje del lenguaje de programación, en este caso C++. Si el lenguaje lo trae y es totalmente necesario en ciertas estructuras de flujo de control
3, hay que usarlo. Ésto puede darse a discusión, asi que plantearé mi segundo motivo.
El
goto puede saltar a cualquier linea de codigo en cualquier archivo de codigo en nuestro programa, por lo que es un arma de doble filo. En cambio
break salta al final del bucle siempre y
continue al inicio del loop. Por lo que la depuración es sencilla.
Permite escapar de un loop sin necesidad de crear una nueva variable de control, y personalmente, lo encuentro una salida elegante para terminar una ejecución repetitiva.
Más allá de esto, gustos son gustos. Pero creo que utilizar saltos con goto violan la programación estructurada, mientras que usar saltos como break o continue no lo hacen.
Pero bueno, a ver si sale con un poco de programación estructurada...
#define MAX(a,b) a>b?a:b
#define MIN(a,b) a<b?a:b
int strcmp1(const char *c1, const char *c2)
{
int i, k, l, cod = 0;
int min;
k = strlen(c1);
l = strlen(c2);
min = MIN(k,l);
for( i = 0; (i < min)&&(cod == 0); i++){
if(c1[i]<c2[i])
cod = -1;
else
if(c1[i]>c2[i])
cod=1;
}
if( cod == 0 )
cod = (k > l)?1:(k < l)?-1:0;
return cod;
}
Y ahora si, conceptualmente correcto, con utilización de centinelas (o banderas), sin saltos y con un único punto de salida. Excelente para cualquier profesor de programación
1 ... y los no tan experimentados...
2 No hablo de Threads
3Ahora pregunto: Como utilizarias el switch de c++ sin utilizar la instrucción
break?
switch (opcion)
{
case 1:
descuento=10;
break;
case 2:
descuento=5;
break;
case 3:
descuento=2;
break;
default:
descuento=0;
break;
}
Seguramente optarias por un bloque if anidado. No utilizando jamás switch.