¿Cuál es el término para el ciclo "while (verdadero)" con "break" dentro? [cerrado]

24

Supongamos que tengo un bucle en C ++ o C # que dice así:

while( true ) {
    doSomething();
    if( condition() ) {
        break;
    }
    doSomethingElse();
}

Esto se llama comúnmente "bucle infinito". Sin embargo, no es técnicamente infinito; se detendrá una vez que fluya el control break.

¿Cuál es el término para tal bucle, que tiene una declaración de control de bucle "bucle para siempre" y "ruptura" dentro?

diente filoso
fuente
22
No creo que haya un término especial.
ChrisF
2
¿Hay alguna garantía de que el control fluirá alguna vez durante las vacaciones? En ese ejemplo, ¿qué condition()pasa si siempre devuelve falso? Yo diría que es un bucle infinito con saltos condicionales.
JohnL
1
Incluso sin a break, el bucle no es infinito ( kill, ctrl-alt-del, desconectar ...). Entonces, ¿por qué molestarse con los detalles de la terminología?
mouviciel
55
"¿Cuál es el término?" - "Esto se llama comúnmente bucle infinito". Esa es tu respuesta allí mismo. Claramente no está satisfecho con el término, pero eso no quita el hecho de que los lenguajes (naturales) son descriptivos. El "término para X" es lo que la gente está usando, no lo que deberían estar usando.
MSalters
55
Esta pregunta parece estar fuera de tema porque es una pregunta de "nombrar esa cosa". "Nombra esa cosa" son malas preguntas por las mismas razones que "identifican este oscuro programa de televisión, película o libro por sus personajes o historia" son malas preguntas: no puedes buscarlas en Google, no son prácticas de ninguna manera, no ayudes a nadie más, y permitirles abre la puerta para hacer otros tipos de preguntas marginales. Ver blog.stackoverflow.com/2012/02/lets-play-the-guessing-game
mosquito

Respuestas:

24

Al estudiar CS, este profesor nos enseñó que hay bucles de verificación previa ( while(cond) {}), bucles de verificación posterior ( do {} while(cond);) y bucles de verificación media . (Podría haber traducido mal esto al inglés, pero entiendes la idea).

C y C ++ no tienen este último (ISTR Ada lo tiene, BICBW), por lo que su construcción se usa para eso en C y C ++.

sbi
fuente
1
Sí, Ada tiene esto:loop ... exit when condition; ... end loop;
Keith Thompson, el
@Keith: ¡Gracias por confirmar! Han pasado casi 20 años desde que hice algo de Ada.
sbi
1
Por lo que vale, he sido programador profesional durante más de 20 años (y un aficionado más tiempo que eso), y nunca he escuchado esos términos.
offby1
Con respecto a la traducción, creo que "en" suele ser más apropiado cuando se usan "pre" y "post", por ejemplo, "preorder / postorder / inorder tree transversal".
Roble
1
El término con el que crecí fue "ciclo de salida media". He trabajado en un par de idiomas diferentes con soporte explícito para bucles de salida media.
mjfgates
13

El primer curso de CS en Stanford ( Metodología de programación de Mehran Sahami ) se refiere a esto como un ciclo y medio . Y no es necesariamente una mala práctica de programación. Considere este ejemplo sobre la recopilación de información del usuario (tomado de The Art and Science of Java por Eric Roberts , donde Roberts también lo llama a-loop-and-a-half ):

prompt user and read in the first value
while (value != sentinel) {
    process the data value
    prompt user and read in a new value
}

Y luego lo mismo se resolvió usando el bucle y una idea a medias para evitar el código duplicado:

while (true) {
    prompt user and read in a value
    if (value == sentinel) break;
    process the data value
}
ernes7a
fuente
10

Al no tener un nombre oficial, lo llamaría Broken Loop . La ambigüedad de este término es intencionada, ya que una ruptura en medio de un ciclo es un poco impura, casi como a goto.

usuario281377
fuente
Yo diría, mucho peor que un goto. Prefiero ver un goto que una condición falsamente construida en un bucle como ese.
Brian Knoblauch, el
14
@Brian ¿Qué? La condición 'verdadera' lo hace obvio y los bucles como ese son realmente comunes. Por ejemplo, si desea agregar cada línea de un archivo a una lista, debe intentar leer la línea (hacer algo), detenerse si falla (si se rompe la condición), de lo contrario agregarla a la lista y repetir (hacer algo) más).
Craig Gidney
77
No hay nada de malo en romper en medio de un bucle. Si necesita realizar alguna operación en cada inicio del ciclo, deberá duplicar el código o introducir estas operaciones en la condición. Cualquiera de las variantes claramente tiene desventajas. gototambién tenía aplicaciones válidas, por ejemplo, emulación de un intento ... finalmente bloquee en C.
Malcolm
1
Malcolm: El posible problema es que durante la lectura del código, es más difícil ver cuándo y por qué se cierra el ciclo. Surgen problemas adicionales cuando anida dos o más de estos bucles y desea salir del bucle externo en función de una condición que se encuentra en el bucle interno.
user281377
Digamos que usted tiene un bucle de eventos de conducir una aplicación Xorg, al igual que (en pseudo-código :) while(XEventGet(&ev) != NULL){ ... }, que está naturalmente va a querer comprobar las claves dentro del ciclo: if(ev.key == XK_q) break;. Hacer lo siguiente: while(XEventGet(&ev) != NULL && ev.key != XK_q){ ... }es feo y podría decirse que es más difícil de leer que una pausa de medio ciclo. Además, ¿qué sucede si primero se debe hacer algo con el valor antes de que se pueda verificar? No vas a meter todo eso en el caso base del bucle, ¿verdad?
Braden Best
8

No hay nombre definitivo. El bucle infinito es, creo, el término apropiado. No hay bucles realmente infinitos, pero esto tiene el potencial de ser efectivamente infinito ya que es posible que la rama que contiene la ruptura nunca ocurra.

Si le dice a alguien "cree un bucle infinito y use un descanso para la condición X" y sabrá a qué se refiere. Si alguien está revisando su código y no dice nada más que "No me gusta el bucle infinito que escribió", sabrá de qué está hablando (a menos que tenga más de uno, por supuesto).

Bryan Oakley
fuente
1
No es un bucle infinito; tiene una condición de terminación bien definida, al igual que un whilebucle normal y la forma en que realiza la prueba de terminación es exactamente la misma (encontrar una métrica con disminución monotónica es un gran comienzo).
Donal Fellows
8

Es un bucle do-while con el condicional en el lugar equivocado.

Malfist
fuente
2
Sí, debería escribirse: while (keep_going) {doSomething (); if (condición) {keep_going = false; } else {doSomethingElse (); }}
Stephen Gross
10
entonces ... estás diciendo que si estás impartiendo un curso de informática y quieres describir esto, dirías "y ahora, vamos a aprender sobre el bucle * do-while con el condicional en el lugar equivocado "? Eso suena más como una opinión religiosa que como un nombre.
Bryan Oakley
55
@StephenGross Ese fragmento de código es una sugerencia horrible. Refactorice para poner la condición real en la definición del bucle, o simplemente use breako continue. Evite los valores centinela a toda costa, son solo otra parte arbitraria del estado a seguir mentalmente, que oculta el propósito del código.
Izkata
2
Los valores sentinales son gotos retrasados.
Winston Ewert
2
-1 por ser un pito de salida única.
Donal Fellows
6

Yo votaría por el "bucle incondicional" , similar al "salto incondicional". Ilustra exactamente lo que está sucediendo (el código se repite incondicionalmente), sin mentir (a diferencia del "bucle infinito").

tdammers
fuente
1
Pero tiene una condición de terminación; eso if/ breaken el medio es parte del patrón.
Donal Fellows
5

¿Cuál es el término para tal bucle, que tiene una declaración de control de bucle "bucle para siempre" y "ruptura" dentro?

Es un bucle infinito con una condición de interrupción.

Estoy de acuerdo con ammilind en que si quisieras darle un nombre especial, podrías llamarlo un bucle parcial infinito

Ramhound
fuente
1
No es infinito en absoluto; el punto donde se verifica la condición de terminación está en un lugar diferente.
Donal Fellows
5

En el Código de Rosetta, este patrón particular se describe como un bucle "N más una mitad" . Si bien no es mi término favorito, no es terrible y es claramente un patrón que es útil para algunos tipos de bucles. (Las alternativas son duplicar el código antes de la condición, potencialmente complicado en programas reales, o aumentar la profundidad de anidamiento del código después de la condición mientras se agrega una variable de condición de bucle; ni mejora la capacidad de mantenimiento ni la comprensión del código . La única razón para rechazar tales construcciones es si uno insiste en escribir bucles para que no tenga problemas break.)

Compañeros de Donal
fuente
4

No hay un término estándar, pero lo diría como un bucle parcial .

Este bucle se usa cuando desea romper solo después de ejecutar alguna parte del bucle por última vez (es decir, ejecución parcial). Se usa cuando no encuentra una situación adecuada en la que desee romper todo el ciclo .

En este caso, desea romper el ciclo después de al menos ejecutarlo por doSomething()última vez.

iammilind
fuente
2

Tengo que estar de acuerdo con SBI aquí, me gusta el término del bucle de verificación de en medio . Este tipo de construcción fue más popular cuando la programación estructurada comenzó a funcionar y muchos lenguajes tenían soporte sintáctico para ellos.

Dicho esto, ahora se sabe que while se sabe bucles suelen ser más mantenibles, ya que es más fácil razonar sobre los invariantes y, a menudo, manejan mejor el complicado caso vacío.

En su caso particular, su bucle es equivalente a

for(; doSomething(), !condition(); doSomethingElse()){}

así que solo usaría la breakversión sidoSomething o doSomethingElseinvolucrara varias declaraciones y prefiero no guardarlas en funciones separadas como lo hizo usted.

Dicho esto, si su ciclo es más complicado que una iteración (inicio, verificación, incremento), entonces debería considerar refactorizarlo en algo más simple.

hugomg
fuente
1

Supongo que si vamos a tratar de inventar un término para esto, tal vez:

Lazo Escapable

LarsTech
fuente
-1. la pregunta no se trata de inventar un nombre, se trata de si ya existe un nombre común. Además, todos los bucles son "escapables", por lo que no es un nombre particularmente efectivo.
Bryan Oakley
@BryanOakley Un bucle infinito, por definición, no debería ser rompible. Probablemente no debería haber un término para esto, aparte de una mala programación.
LarsTech
0

No es tan malo en todos los casos. Me encuentro escribiendo este tipo de bucles con cierto tipo de API. Digamos, por ejemplo, que tiene un objeto de bucle y necesita verificar alguna condición bastante profunda en él, así:

while (loop
    .getAExecutionModelFactory()
    .getActiveXexecutor()
    .getYCancelModelHandler()
    .getCurrentHandler()
    .isCancelled()) {
        // ... do something with the current Handler ....
        loop = ..... // prepare for next loop
}

Ahora suponga que cada método getXXX podría devolver un valor nulo. Entonces aún sería posible escribir una expresión booleana, aunque bastante complicada e ilegible. Y luego tenemos que rehacer casi lo mismo para llegar al objeto controlador actual. En tales casos, me resulta más fácil escribir unwhile (true) bucle con pausa y continuar.

Ingo
fuente