¿Es el código “while (condición);” válido y qué significa?

¿Podemos poner un punto y coma como while(condition); en una progtwigción de C? Si while(condition); es válido, ¿qué significa?

 while (condition); 

es lo mismo que

 while (condition) { } 

Se puede utilizar para bucles de espera, por ejemplo:

 while (!isLightGreen()); // waits until isLightGreen() returns true go(); 

Significa que el cuerpo del bucle está vacío. Normalmente, este patrón se utiliza cuando la condición en sí funciona.

Por ejemplo, este bucle puede copiar bytes dentro de la condición:

 while ( '\0' != (*pt++ = *ps++)) ; 

Si está utilizando un punto y coma, es una buena idea colocarlo en una línea separada para que parezca menos un error. Personalmente tiendo a usar llaves vacías – {}, y algunas veces un comentario de que el bloque vacío es intencional.

Editar:

En el segundo comentario, Tom Anderson señala una mejora sobre un punto y coma en solitario. La guía de estilo de C ++ de Google recomienda esto o {}.

 while ( '\0' != (*pt++ = *ps++)) continue; 

Sí tu puedes. Solo significa que el bucle while se mantendrá en bucle hasta que la condition sea ​​falsa. Por ejemplo:

 #include int x = 10; int func() { printf("%d\n", x); return --x; } int main() { while(func()); return 0; } 

Pero en general las personas no hacen esto, ya que tendría más sentido poner la lógica en el cuerpo del bucle.

Editar:

Hay algunos ejemplos de esto en uso, por ejemplo, copiando una cadena terminada en nulo:

 char dest[256]; char *src = "abcdefghijklmnopqrstuvwxyz"; while(*(dest++) = *(src++)); 

Debido a que la condición realmente puede tener efectos secundarios, se permite tal construcción. Considera lo siguiente:

 while (*p && *p++ != ' '); 

Esto haría avanzar el puntero p al primer carácter que es un espacio.

Incluso puede usar el operador de coma para tener declaraciones comunes dentro de la condición:

 while (do_something(), do_something_else(), i < n); 

Debido a que las declaraciones relacionadas con el operador de coma evalúan a la instrucción más a la derecha, en ese caso i < n , lo anterior es idéntico a:

 do { do_something(); do_something_else(); } while (i < n); 

Seguirá evaluando la condición hasta que sea falso. Es un bucle sin cuerpo.

Los progtwigdores a menudo agregan un espacio antes del punto y coma, es decir

 while(condition) ; 

o llaves vacías:

 while(condition) {} 

Mostrar el cuerpo vacío es intencional y no solo un error tipográfico. Si está leyendo algún código fuente existente y se pregunta por qué hay un bucle vacío allí, debería leer las siguientes líneas también para ver si el punto y coma realmente debería estar allí o no (es decir, haga que las siguientes líneas se vean como el cuerpo de un bucle o no?).

Sí, es correcto. Se repetirá la condición hasta que sea falsa.

 while ( condition() ); 

Siempre escribo esto como:

 while (condition()) continue; 

Así que es obvio que no fue un error. Como han dicho otros, solo tiene sentido cuando la condición () tiene efectos secundarios.

while () es un bucle. Probablemente estés buscando hacer un bucle “do-while”. Los bucles Do-while se ejecutan en este formato:

 do { // Your process // When something goes wrong or you wish to terminate the loop, set condition to 0 or false } while(condition); 

El que has enumerado anteriormente, sin embargo, es un bucle vacío.

mientras que () los bucles funcionan casi igual; simplemente no hay una porción de “hacer”.

¡Buena suerte!

Significa que seguir comprobando condición hasta que se evalúe como falso.

La clave para entender esto es que la syntax del bucle while en “C” es la siguiente:

 while (condition) statement 

Donde la statement puede ser cualquier statement “C” válida. Las siguientes son todas las declaraciones “C” válidas:

 { statements } // a block statement that can group other statements statement; // a single statement terminated by a ; ; // a null statement terminated by a ; 

Por lo tanto, según las reglas del bucle while , la parte de la instrucción (instrucción nula en su ejemplo) se ejecutará (no hacer nada) siempre que la condición sea verdadera . Esto es útil porque equivale a una espera ocupada hasta que la condición se vuelve falsa . No es una buena forma de esperar, pero sí útil. Podría usar esta construcción, por ejemplo, si desea esperar a que otro hilo (o un controlador de señal) establezca una variable en algún valor antes de continuar.

El código while(condition); Es un código perfectamente válido, aunque sus usos son pocos. Presumo que la condition es una variable, no una función; otros aquí discuten la condition funcional.

Un uso de while(condition); puede ser bloquear mientras se espera una señal, por ejemplo, SIGHUP , donde el controlador de señales cambia la condition variable. Sin embargo, esta no suele ser la mejor manera de esperar una señal. Uno usualmente usaría un sleep en el bucle, es decir, while(condition) { sleep(1); } while(condition) { sleep(1); } .

La ausencia de sleep significa que el bucle se procesará continuamente mientras tanto, y probablemente se perderán los ciclos de procesamiento. A menos que el proceso tenga sus recursos administrados (e incluso allí …), creo que esto solo es adecuado cuando el bucle debe romperse en un intervalo menor que la granularidad del comando de sleep disponible (es decir, el segundo granulado granula la suspensión). pero necesita el código después del aspecto ejecutado con un tiempo de respuesta inferior al segundo). Dicho esto, un tubo o zócalo de locking puede ser preferible a las señales, en lo que respecta al rendimiento, aunque no tengo ningún tipo de datos empíricos para respaldar eso de manera inmediata, y sospecho que el rendimiento puede variar significativamente según la plataforma.

Uno podría tener una condition modificada por un subproceso paralelo del mismo proceso, pero creo que se debería preferir hacerlo por medio de un mutex o un semáforo (es decir, la condition puede ser más que una simple variable).

Espero que sea útil, o al menos algo para pensar!

Es sólo un bucle vacío. Ayudaría si explicara cuál es la condición.

Si la evaluación de la condición no modifica un valor que influye en la condición en sí, while(condition); es un bucle infinito vacío, lo que significa que nunca terminará (y nunca hará nada excepto que consum tiempo de CPU).

es absolutamente correcto significa no hacer nada en el bucle, solo sondear la condición. Y es común en los códigos del sistema integrado.

Es solo un bucle while sin cuerpo de ejecución.

 while(condition); 

es igual que

 while(condition) { } 

Solo otro uso no descrito aquí:

 do { if(out_of_memory) break; if(file_does_not_exist) break; return ok; } while(0); return error; 

Esto le permite evitar varias llamadas devueltas o instrucciones goto.