¿Qué tipo de bucle es para (;;)?

5 minutos de lectura

avatar de usuario
usuario242294

Encontrado en torvalds/linux-2.6.git -> kernel/mutex.c línea 171

He intentado encontrarlo en Google y tal en vano.

Que hace for (;;) ¿instruir?

  • ese no es un comentario útil. El hecho de que Konman no esté tan versado en C no significa que no pueda leer archivos de código. Y ahora han aprendido algo, así que eso es algo bueno.

    – Alastair Pitts

    2 de enero de 2010 a las 14:52

  • Estoy de acuerdo con Alastair. Leer la fuente escrita por otros es una gran manera de aprender.

    – CesarGon

    2 de enero de 2010 a las 15:09

  • Si no está bien versado en c, lea el código del núcleo.

    – solo alguien

    2 de enero de 2010 a las 17:40

  • @Kim A pesar de las protestas, tu punto es válido. Es cierto que el OP aprendió algo, pero al hacer una pregunta en SO, no al leer el código del kernel. Hay formas mucho más eficientes de aprender que leer código en un idioma del que uno ni siquiera conoce los conceptos básicos y luego preguntar SO sobre cada pequeña cosa que uno no entiende.

    –Jim Balter

    11 de mayo de 2011 a las 4:54


  • PD La mayoría de las respuestas aquí son engañosas. for(;;) no es (necesariamente) un ciclo “infinito”, es simplemente un ciclo que no prueba la condición en el for(...) construirse a sí mismo. Esto es particularmente relevante en el código citado por el OP: la primera declaración dentro del ciclo es if (...) break;, y también hay varias otras interrupciones condicionales en el ciclo; nada en absoluto “infinito” al respecto.

    –Jim Balter

    11 de mayo de 2011 a las 5:02


Literalmente significa “no hacer nada, hasta que no pase nada y en cada paso, no hagas nada para prepararte para el siguiente”. Básicamente, es un bucle infinito que tendrás que romper de alguna manera desde dentro usando un break, return o goto declaración.

El for(;;) es una condición de bucle infinito, similar a while(1) como la mayoría ya ha mencionado. Vería esto más a menudo, en códigos mutex del kernel, o mutex, por ejemplo, problemas como cenar filósofos. Hasta que la variable mutex se establezca en un valor particular, de modo que un segundo proceso obtenga acceso al recurso, el segundo proceso continúa en bucle, también conocido como espera ocupada. El acceso a un recurso puede ser acceso al disco, por el cual dos procesos compiten para obtener acceso mediante un mutex, de modo que a la vez solo un proceso tiene acceso al recurso.

  • Los bucles infinitos y las esperas ocupadas son cosas diferentes. Una espera ocupada es un insomne bucle esperando alguna condición, nada infinito al respecto.

    –Jim Balter

    11 de mayo de 2011 a las 4:50

  • @Jim, para ser justos, ningún ciclo es infinito, ya que podría perder energía en cualquier momento o su máquina morirá de vejez. Está hablando más de pedirle al compilador un bucle sin condición final que algo realmente infinito.

    – Ciego

    8 de agosto de 2011 a las 19:59

  • @Blindy Way para perder el punto y ser absurdamente pedante al mismo tiempo. Como duh, no sabía sobre la muerte térmica del universo. Mientras tanto, ocupado las esperas son, como dije, insomnes, y tienen condiciones finales.

    –Jim Balter

    8 de agosto de 2011 a las 23:29

Es un bucle infinito que no tiene condición inicial, condición de incremento ni condición final. Por lo tanto, iterará para siempre equivalente a while (1).

  • al menos un compilador que conozco advertirá sobre los bucles while (1) o while (true), pero “sabe” que no debe producir diagnósticos para ( ; ; ), ya que se considera la forma “estándar” para bucles infinitos.

    –Peter Joot

    2 de enero de 2010 a las 15:36

Se repite para siempre (hasta que el código dentro del ciclo llama break o returnpor supuesto. while(1) es equivalente, personalmente me parece más lógico usar eso.

avatar de usuario
trigos

es equivalente a while( true )

Editar: dado que ha habido cierto debate provocado por mi respuesta (buen debate, eso sí), debe aclararse que esto no es del todo exacto para los programas C no escritos en C99 y más allá en los que stdbool.h ha establecido el valor de verdadero = 1.

  • Necesitan un sistema de voto negativo de comentarios.

    – Ciego

    2 de enero de 2010 a las 14:11

  • Oye, solo está tratando de asegurarse de que las personas preparen sus aplicaciones para el futuro contra la posibilidad de que cambie el valor de ‘verdadero’.

    – Frank Granjero

    2 de enero de 2010 a las 14:16

  • Ugh, el dolor de un idioma donde “1” es un valor “Verdadero” más autorizado que un valor booleano “verdadero”.

    – Despistado

    2 de enero de 2010 a las 14:21

  • @Blindy: ¿Por qué rechazarías su comentario? @Frank: ¿Cambiar de qué? true no está definido en el estándar C.

    – sepp2k

    2 de enero de 2010 a las 14:44

  • @GregS: No. ¡Siempre que sea cierto! = 0 🙂

    – Ant

    2 de enero de 2010 a las 15:10

avatar de usuario
GuruKulki

es un bucle for infinito.

  • Necesitan un sistema de voto negativo de comentarios.

    – Ciego

    2 de enero de 2010 a las 14:11

  • Oye, solo está tratando de asegurarse de que las personas preparen sus aplicaciones para el futuro contra la posibilidad de que cambie el valor de ‘verdadero’.

    – Frank Granjero

    2 de enero de 2010 a las 14:16

  • Ugh, el dolor de un idioma donde “1” es un valor “Verdadero” más autorizado que un valor booleano “verdadero”.

    – Despistado

    2 de enero de 2010 a las 14:21

  • @Blindy: ¿Por qué rechazarías su comentario? @Frank: ¿Cambiar de qué? true no está definido en el estándar C.

    – sepp2k

    2 de enero de 2010 a las 14:44

  • @GregS: No. ¡Siempre que sea cierto! = 0 🙂

    – Ant

    2 de enero de 2010 a las 15:10

avatar de usuario
permuta

Es lo mismo que escribir un bucle infinito usando la declaración “for”, pero tienes que usar break o alguna otra declaración que pueda salir de este bucle.

¿Ha sido útil esta solución?