Articulo de referencia

Bucle (instrucción)

En programación informática , un bucle es una estructura de control de flujo que permite ejecutar código repetidamente, generalmente con pequeñas modificaciones entre repeticion...

En programación informática , un bucle es una estructura de control de flujo que permite ejecutar código repetidamente, generalmente con pequeñas modificaciones entre repeticiones. Los bucles se pueden usar para realizar una acción repetida en todos los elementos de una colección o para implementar un programa de larga duración.

Descripción general

Los bucles son una característica de los lenguajes de programación de alto nivel . En los lenguajes de programación de bajo nivel, la misma funcionalidad se logra mediante saltos . Cuando un programa se compila a código máquina , los bucles pueden implementarse mediante saltos; sin embargo, algunos bucles pueden optimizarse para ejecutarse sin saltos. [ 1 ]

Por lo general, se espera que los bucles se ejecuten durante un número finito de iteraciones. Sin el debido cuidado, pueden crearse bucles que no tienen posibilidad de terminar. Estos bucles se denominan bucles infinitos . El problema de determinar si un programa contiene un bucle infinito se conoce como el problema de la parada .

Bucle condicional

Un bucle condicional (también conocido como bucle indeterminado [ 2 ] ) es un bucle que determina si debe terminar en función de una condición lógica. [ 3 ] Estos bucles son flexibles, pero su comportamiento exacto puede ser difícil de comprender. [ 4 ] : ​​368

Un bucle condicional generalmente se compone de dos partes: una condición y un cuerpo . La condición es una expresión lógica que depende del estado del programa y el cuerpo es un bloque de código que se ejecuta mientras la condición se cumple. [ 3 ]

Una idea errónea común es que la ejecución del cuerpo termina tan pronto como la condición deja de cumplirse; pero esto generalmente no es así. [ 4 ] : 368 En la mayoría de los lenguajes de programación, la condición se verifica una vez por cada ejecución del cuerpo . El momento en que se verifica la condición no está estandarizado y algunos lenguajes de programación contienen múltiples estructuras de bucles condicionales con diferentes reglas sobre cuándo se evalúa la condición .

Bucle de pre-prueba

Un bucle de preprueba es un bucle condicional donde la condición se verifica antes de que se ejecute el cuerpo . Más precisamente, se verifica la condición y, si se cumple, se ejecuta el cuerpo . Después, se vuelve a verificar la condición y, si se cumple , se ejecuta el cuerpo de nuevo. Este proceso se repite hasta que la condición deja de cumplirse. Muchos lenguajes de programación llaman a este bucle bucle while y se refieren a él con la palabra clave while . Suelen tener un formato similar a

mientras la condición hace que el cuerpo se repita

En lugar de las palabras clave do y repeat , a veces se utilizan otros métodos para indicar dónde comienza y termina el cuerpo , como llaves [ 5 ] o espacios en blanco . [ 6 ]

Por ejemplo, el siguiente fragmento de código primero comprueba si x es menor que cinco, lo cual es cierto, por lo que se accede al cuerpo del bucle. Allí, se muestra x y luego se incrementa en uno. Tras ejecutar las instrucciones del cuerpo , se vuelve a comprobar la condición y se ejecuta el bucle de nuevo. Este proceso se repite hasta que x tenga el valor cinco.

x ← 0 mientras x < 5 hacer mostrar( x ) xx + 1 repetir

Bucle posterior a la prueba

Diagrama de flujo del bucle Do-While

Un bucle de prueba posterior es un bucle condicional donde la condición se verifica después de que se ejecuta el cuerpo . Más precisamente, el cuerpo se ejecuta y luego se verifica la condición . Si se cumple, el cuerpo se ejecuta de nuevo y luego se verifica la condición . Esto se repite hasta que la condición no se cumple. A veces se le llama bucle do-while debido a la sintaxis utilizada en varios lenguajes de programación, [ 7 ] aunque esto puede ser confuso ya que Fortran y PL/I usan la sintaxis "DO WHILE" para bucles de prueba previa. [ 8 ] [ 9 ] Los bucles de prueba posterior se formatean comúnmente de manera similar a

El cuerpo repite mientras se cumple la condición

En lugar de las palabras clave " do" y "repeat" , a veces se utilizan otros métodos para indicar dónde comienza y termina el cuerpo , como las llaves. [ 10 ]

Algunos lenguajes pueden usar una convención de nomenclatura diferente para este tipo de bucle. Por ejemplo, los lenguajes Pascal y Lua tienen un bucle " repeat until ", que continúa ejecutándose hasta que la expresión de control sea verdadera y luego finaliza. [ 11 ] [ 12 ]

Bucle for de tres partes

Diagrama de flujo de un bucle for que imprime cinco asteriscos.

Un bucle for de tres partes , popularizado por C, tiene dos partes adicionales: inicialización ( variante de bucle ) e incremento , ambas son bloques de código. La inicialización está pensada como código que prepara el bucle y se ejecuta una vez al principio, y el incremento se utiliza para actualizar el estado del programa después de cada iteración del bucle. De lo contrario, el bucle for de tres partes es un bucle de preprueba. Suelen formatearse de manera similar a

para inicialización , condición , incremento hacer cuerpo repetir

Esta sintaxis proviene de B y fue inventada originalmente por Stephen C. Johnson . [ 13 ] El siguiente código C es un ejemplo de un bucle de tres partes que imprime los números del 0 al 4.

for ( int i = 0 ; i < 5 ; i ++ ) { printf ( "%d \n " , i ); }

Construcciones equivalentes

Suponiendo que existe una función o método debidamente declarado llamado do_work(), los siguientes son equivalentes en lenguajes de programación que admiten bucles de post-prueba. [ 14 ]

Además, dado que continueno se utiliza una declaración, lo anterior es técnicamente equivalente a lo siguiente, aunque estos ejemplos no son típicos ni de estilo moderno utilizados en las computadoras cotidianas. [ 15 ] [ 16 ]

mientras que es cierto lo hacen hacer_trabajo() Si la condición no es verdadera, entonces salir del bucle. Fin del bucle. Repetir.

o alternativamente,

INICIO DEL BUCLE: hacer_trabajo() Si se cumple la condición , entonces ir a BLOOPSTART. Fin de la condición.

Enumeración

Los bucles foreach se utilizan casi siempre para iterar sobre los elementos de una secuencia.

Una enumeración (también conocida como bucle determinado [ 2 ] ) es un bucle diseñado para iterar sobre todos los elementos de una colección. [ 17 ] No es tan flexible como un bucle condicional, pero es más predecible. Por ejemplo, es más fácil garantizar que las enumeraciones terminen y que eviten posibles errores de índice . Las enumeraciones pueden implementarse utilizando un iterador , ya sea de forma implícita o explícita.

Dependiendo del lenguaje de programación, se utilizan varias palabras clave para invocar enumeraciones. Por ejemplo, los descendientes de ALGOL usan for, [ 18 ] mientras que los descendientes de Fortran usan do[ 19 ] y COBOL usa PERFORM VARYING. [ 20 ]

Las enumeraciones a veces se denominan "bucles for", por ejemplo en Zig y Rust . [ 21 ] [ 22 ] Esto puede resultar confuso, ya que muchos de los lenguajes de programación más populares [ 23 ] , como C, C++ y Java , utilizan ese término para el bucle for de tres partes, [ 24 ] [ 25 ] [ 26 ] que no es una enumeración. Otros lenguajes de programación, como Perl y C# , evitan esta confusión utilizando el término "bucle foreach". [ 27 ] [ 28 ]

El orden en que se iteran los elementos de la colección depende del lenguaje de programación. Fortran 95 tiene un bucle, invocado mediante la palabra clave FORALL, que es independiente de este orden. Tiene el efecto de ejecutar cada iteración del bucle al mismo tiempo. Esta característica quedó obsoleta en Fortran 2018. [ 29 ]

Bucles en la programación funcional

En la mayoría de los lenguajes de programación funcional , se utiliza la recursión en lugar de los bucles tradicionales. Esto se debe a que las variables son inmutables y, por lo tanto, no se puede realizar el incremento de un bucle. [ 30 ]

Para evitar errores de desbordamiento de pila en bucles largos, los lenguajes de programación funcional implementan la optimización de llamadas de cola , que permite usar el mismo marco de pila para cada iteración del bucle, compilando así el mismo código que un bucle while o for . [ 31 ]

Algunos lenguajes, como Haskell , tienen una sintaxis conocida como comprensión de listas , que es similar a la enumeración, iterando sobre el contenido de una lista y transformándola en una nueva lista.

Contador de bucle

Un contador de bucle es una variable de control que gestiona las iteraciones de un bucle. Los contadores de bucle cambian con cada iteración, proporcionando un valor único para cada una. El contador de bucle se utiliza para determinar cuándo debe finalizar el bucle. Se denomina así porque, en la mayoría de los casos, esta variable toma un rango de valores enteros.

Una convención común para nombrar identificadores es que el contador de bucle use los nombres de variable i , j y k (y así sucesivamente si es necesario), [ 32 ] donde i sería el bucle más externo, j el siguiente bucle interno, etc. Generalmente se acepta que este estilo se originó en la programación temprana de Fortran , donde estos nombres de variable que comienzan con estas letras se declaraban implícitamente como de tipo entero, y por lo tanto eran opciones obvias para contadores de bucle que solo se requerían temporalmente. La práctica se remonta aún más atrás a la notación matemática donde los índices para sumas y multiplicaciones a menudo son i , j y k .

Algunos desaconsejan el uso de nombres breves para los contadores de bucle, como i y j , ya que el propósito de las variables no queda tan claro como si se les asignara un nombre más largo y descriptivo. [ 4 ] : 383–382

Los distintos lenguajes de programación especifican reglas diferentes sobre el valor que conservará el contador del bucle al finalizar su ejecución, e incluso algunos establecen que este valor queda indefinido. Esto permite que un compilador genere código que deje cualquier valor en el contador del bucle, o incluso que lo deje sin cambios, ya que el valor del bucle se almacenó en un registro y nunca se guardó en memoria. El comportamiento real puede incluso variar según la configuración de optimización del compilador.

Modificar el contador del bucle dentro del cuerpo del mismo puede tener consecuencias inesperadas. Para evitar estos problemas, algunos lenguajes hacen que el contador del bucle sea inmutable . Sin embargo, es probable que el compilador solo detecte los cambios explícitos. En situaciones donde la dirección del contador del bucle se pasa como argumento a una subrutina , resulta muy difícil verificarlo, ya que el comportamiento de la rutina suele ser desconocido para el compilador, a menos que el lenguaje admita firmas de procedimientos e intenciones de argumentos.

Salida anticipada y continuación

Algunos lenguajes también pueden proporcionar instrucciones de apoyo para modificar cómo procede la iteración de un bucle. Entre las más comunes se encuentran la instrucción break , que finaliza el bucle actual en el que se encuentra el programa, y ​​la instrucción continue , que salta a la siguiente iteración del bucle actual. [ 4 ] : 379 Estas instrucciones pueden tener otros nombres; por ejemplo, en Fortran 90 , se llaman exit y cycle .

Un bucle también puede finalizarse devolviendo un valor desde la función dentro de la cual se está ejecutando.

En el caso de bucles anidados, las instrucciones `break` y `continue` se aplican al bucle más interno. Algunos lenguajes permiten etiquetar los bucles. Estas instrucciones se pueden aplicar a cualquiera de los bucles anidados en el programa.

bucle_exterior: (Esta es una etiqueta para el bucle más externo) para 1 ≤ i ≤ 2 hacer para 1 ≤ j ≤ 2 hacer mostrar(i, j) Si i = 2, continuar bucle externo. Fin del bucle. Repetir . Repetir (Este bucle anidado muestra los pares (1, 1), (1, 2) y (2, 1)).

Bucle infinito

Un bucle infinito es un bucle que nunca termina. Esto puede ser intencional o el resultado de un error lógico .

La detección sistemática de bucles infinitos se conoce como el problema de la parada .

Los bucles infinitos son útiles en aplicaciones que necesitan realizar un cálculo repetido hasta que un programa finalice, como los servidores web . [ 33 ]

Véase también

Referencias

  1. Angelou, Alexandros; Dadaliaris, Antonios; Dossis, Michael; Dimitriou, Georgios (26 de noviembre de 2021). «Generación de código sin ramificaciones para arquitecturas de procesadores modernas» . 25.ª Conferencia Panhelénica de Informática . Nueva York, NY, EE. UU.: ACM. págs. 300–305 . doi : 10.1145/3503823.3503879 . ISBN  978-1-4503-9555-7.
  2. 1 2 Samanta, Debasis; Sarma, Monalisa (15 de junio de 2023). Joy with Java: Fundamentals of Object Oriented Programming . Cambridge University Press. pág. 124. ISBN  978-1-009-21190-1.
  3. 1 2 "Bucles condicionales - Estructuras computacionales - Revisión de Ciencias de la Computación National 4" . BBC Bitesize . Archivado del original el 19 de octubre de 2021. Recuperado el 8 de enero de 2026 .
  4. 1 2 3 4 McConnell, Steve (9 de junio de 2004). Code Complete . Pearson Education. ISBN 978-0-7356-3697-2.
  5. "Instrucción while (Manual del lenguaje C de GNU)" . www.gnu.org . Archivado del original el 12 de julio de 2024. Consultado el 8 de enero de 2026 .
  6. "3. Una introducción informal a Python" . Documentación de Python . Archivado del original el 31 de diciembre de 2025. Consultado el 8 de enero de 2026 .
  7. "do...while - JavaScript | MDN" . MDN Web Docs . 2025-07-08 . Consultado el 2026-01-22 .
  8. "DO WHILE (Referencia del lenguaje FORTRAN 77)" . docs.oracle.com . Archivado del original el 14 de marzo de 2023. Consultado el 8 de enero de 2026 .
  9. "Comando DO (PL/I)" . www.ibm.com . Archivado del original el 2 de marzo de 2025. Consultado el 22 de enero de 2026 .
  10. "Instrucción do-while (Manual del lenguaje C de GNU)" . www.gnu.org . Archivado del original el 13 de julio de 2024. Consultado el 8 de enero de 2026 .
  11. "La instrucción Repeat...until" . www.freepascal.org . Archivado del original el 9 de noviembre de 2025. Consultado el 22 de enero de 2026 .
  12. "Programación en Lua : 4.3.3" . www.lua.org . Archivado del original el 2 de enero de 2026. Consultado el 22 de enero de 2026 . 
  13. Thompson, Ken . VCF East 2019 – Brian Kernighan entrevista a Ken Thompson . YouTube . Archivado del original el 12/12/2021 . Recuperado el 16/11/2020 . Vi la versión con punto y coma del bucle for de Johnson y la puse en [B], la robé.
  14. "Las sentencias while y do-while (Tutoriales de Java™ > Aprendiendo el lenguaje Java > Conceptos básicos del lenguaje)" . docs.oracle.com . Consultado el 16 de mayo de 2026 .
  15. Parlante, Nick. "While Loop" . Universidad de Stanford. Consultado el 16-05-26.
  16. "3.12. Usos legítimos de goto" . icarus.cs.weber.edu . Consultado el 16 de mayo de 2026 .
  17. McConnell, Steve (9 de junio de 2004). Code Complete . Pearson Education. pág. 367. ISBN  978-0-7356-3697-2.
  18. Wirth, Niklaus (1973). «Prefacio». Programación sistemática: una introducción . Prentice-Hall. págs. xiii. ISBN  0138803692.
  19. "DO / END DO" . www.ibm.com . 24 de abril de 2018. Archivado del original el 8 de enero de 2026. Consultado el 8 de enero de 2026 .
  20. "PERFORM with VARYING Phrase" . www.ibm.com . Junio ​​de 2012. Archivado del original el 8 de enero de 2026. Consultado el 8 de enero de 2026 .
  21. "Documentación de Zig" . ziglang.org . Archivado del original el 4 de enero de 2026. Consultado el 8 de enero de 2026 .
  22. "Recorriendo una colección con for" . rust-lang.org . Archivado del original el 19 de diciembre de 2025. Consultado el 8 de enero de 2026 .
  23. "Índice TIOBE de septiembre de 2024" . Archivado del original el 4 de enero de 2026. Consultado el 16 de diciembre de 2025 .
  24. "for Statement (GNU C Language Manual)" . www.gnu.org . Archivado del original el 13 de julio de 2024. Consultado el 8 de enero de 2026 .
  25. "for statement (C++)" . learn.microsoft.com . Archivado del original el 28 de septiembre de 2025 . Consultado el 8 de enero de 2026 .
  26. "La instrucción for (Tutoriales de Java™ > Aprendiendo el lenguaje Java > Conceptos básicos del lenguaje)" . docs.oracle.com . Archivado del original el 28 de diciembre de 2025. Consultado el 8 de enero de 2026 .
  27. "Instrucciones de iteración: for, foreach, do y while - Referencia de C#" . learn.microsoft.com . Archivado del original el 28 de diciembre de 2025. Consultado el 8 de enero de 2026 .
  28. "Bucle for en Perl" . Tutorial de Perl . Archivado del original el 7 de junio de 2025. Consultado el 8 de enero de 2026 .
  29. "PARA TODOS" . Intel . Archivado del original el 1 de enero de 2026. Consultado el 8 de enero de 2026 .
  30. Hinsen, Konrad (2009). "Las promesas de la programación funcional" . Computing in Science & Engineering . 11 (4): 86– 90. Bibcode : 2009CSE....11d..86H . doi : 10.1109/mcse.2009.129 . ISSN 1521-9615 . 
  31. Clinger, William D. (1998). «Recursión de cola adecuada y eficiencia espacial». Actas de la conferencia ACM SIGPLAN 1998 sobre diseño e implementación de lenguajes de programación . Nueva York, NY, EE. UU.: ACM. págs. 174–185 . doi : 10.1145/277650.277719 . ISBN  0-89791-987-4.
  32. http://www.knosof.co.uk/vulnerabilities/loopcntrl.pdf Análisis de variables de control de bucle en C
  33. "¿Qué es un bucle infinito (bucle sin fin)?" . WhatIs . Consultado el 22/01/2026 .