Foros del Web » Programación para mayores de 30 ;) » C/C++ »

continue vs if en un loop

Estas en el tema de continue vs if en un loop en el foro de C/C++ en Foros del Web. Una consulta a todos, para muchos están mal visto los breaks y continue, (aunque la mayoría coincidimos que si son innecesarios los go to) pero ...
  #1 (permalink)  
Antiguo 15/06/2015, 09:19
Avatar de Doommarine_Maxi  
Fecha de Ingreso: febrero-2011
Mensajes: 54
Antigüedad: 13 años, 2 meses
Puntos: 8
continue vs if en un loop

Una consulta a todos, para muchos están mal visto los breaks y continue, (aunque la mayoría coincidimos que si son innecesarios los go to) pero yo siempre uso los continue o break para sentencias como estas:

Codigo A
Código C:
Ver original
  1. ...
  2. ...
  3. for (int i=0: i < max; i++)
  4. {
  5.         if (myArray[i] != VALOR_DESEADO)
  6.              continue;
  7.  
  8.              //Todo lo que se vaya a ejecutar en el bucle.
  9. }
  10. ...

Uso siempre la "técnica" de arriba en vez de esta:

Codigo B
Código C:
Ver original
  1. ...
  2. ...
  3. for (int i=0: i < max; i++)
  4. {
  5.         if (myArray[i] == VALOR_DESEADO)
  6.         {
  7.              //Todo lo que se vaya a ejecutar en el bucle.
  8.          }
  9. }
  10. ...
  11. ...

Similar con break, por ejemplo deseo encontrar un valor especifico en el array, que se ejecute cierto codigo una unica vez y terminar con el bucle.

Codigo C
Código C:
Ver original
  1. ...
  2. ...
  3. for (int i=0: i < max; i++)
  4. {
  5.        if (condicion especifica)
  6.        {
  7.         //Todo lo que se vaya a ejecutar en el bucle, una sola vez.
  8.          break;
  9.        }
  10. }
  11. ...
  12. ...
Uso siempre la sentencia

Codigo D
Código C:
Ver original
  1. ...
  2. ...
  3. for (int i=0: i < max; i++)
  4. {
  5.        if (condicion especifica)
  6.        {
  7.         //Todo lo que se vaya a ejecutar en el bucle, una sola vez.
  8.          i=max;
  9.        }
  10. }
  11. ...
  12. ...

Ahora la pregunta para todos es, Entre Codigo A y Codigo B, ¿Cual es la mejor manera de escribir el codigo?, lo mismo con Codigo C y Codigo D

PD: Aclaro que este post esta en el foro de C como podría estar en cualquier otro lugar, tal vez el mejor lugar era la sección (si es que hay) de algoritmos o programación estructurada en general del foro. De hecho hace ya tiempo no toco código en C.

Última edición por Doommarine_Maxi; 15/06/2015 a las 09:21 Razón: Aclaración extra
  #2 (permalink)  
Antiguo 15/06/2015, 09:45
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: continue vs if en un loop

Realmente no dejan de ser modismos y cada uno elige uno u otro por unas razones u otras. Veamos:

Caso 1:
Código C:
Ver original
  1. for (int i=0: i < max; i++)
  2. {
  3.         if (myArray[i] != VALOR_DESEADO)
  4.              continue;
  5.  
  6.              //Todo lo que se vaya a ejecutar en el bucle.
  7. }

La principal ventaja de este código es que reduces la indentación. Imagínate que tuvieses que hacer 6 o 7 chequeos para saber si debes ejecutar el contenido del bucle... si resolvieses el problema usando ifs encadenados acabarías con una indentación excesiva, mientras que con esta solución mantienes un nivel de indentación razonable.

Caso 2:
Código C:
Ver original
  1. for (int i=0: i < max; i++)
  2. {
  3.         if (myArray[i] == VALOR_DESEADO)
  4.         {
  5.              //Todo lo que se vaya a ejecutar en el bucle.
  6.          }
  7. }

Los que defienden este código se escudan en que tanto continue como break introducen saltos en el código... a lo que yo suelo pensar que el if también cuando no se cumple la condición.

Al final, creo que la mejor solución depende de cada caso. Lo que debe primar, en mi opinión, es la legibilidad del código y, claro está, dependerá de las condiciones del mismo que una opción ofrezca un código más sencillo que la otra.

Pasando a los otros dos ejemplos tenemos:

Caso 3:

Código C:
Ver original
  1. for (int i=0: i < max; i++)
  2. {
  3.        if (condicion especifica)
  4.        {
  5.         //Todo lo que se vaya a ejecutar en el bucle, una sola vez.
  6.          break;
  7.        }
  8. }

Caso 4:
Código C:
Ver original
  1. for (int i=0: i < max; i++)
  2. {
  3.        if (condicion especifica)
  4.        {
  5.         //Todo lo que se vaya a ejecutar en el bucle, una sola vez.
  6.          i=max;
  7.        }
  8. }

Ahora tengo que hacer una aclaración y es que el caso 4 suele tener la forma que detallo a continuación. El motivo es que suele ser mejor opción usar una variable externa a modificar los valores del for:

Código C:
Ver original
  1. bool continuar = true;
  2. for (int i=0: i < max && continuar; i++)
  3. {
  4.        if (condicion especifica)
  5.        {
  6.         //Todo lo que se vaya a ejecutar en el bucle, una sola vez.
  7.          continuar = false;
  8.        }
  9. }

En este caso, el caso 3 será ridículamente más eficiente que el caso 4, ya que el break se sustituye por un salto al final del bucle mientras que en el otro caso tenemos una asignación, una comparación y un salto al final del bucle... 3 instrucciones a cambio de una. Lo dicho, una mejora de rendimiento despreciable.

El problema que presenta el caso 3 es que para depurarlo (haciendo pasadas generales en el bucle para saber cuándo se sale del mismo) necesitas al menos dos puntos de parada: el inicio del bucle y cada break que haya dentro del bucle, mientras que el caso 4 únicamente necesita un breakpoint.

Está claro que la definición del for en el caso 3 es más legible que la utilizada en el caso 4 (mi versión) y además evitas el uso de una variable adicional.

Al final, ¿en qué quedamos? pues en que, si puedes elegir, elijas siempre la opción que consideres más oportuna en cada momento. Si no puedes elegir no hay mucho que pensar, pero al menos conoces las alternativas.

Etiquetas: saltos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:04.