2012-01-02 13 views
10

Me he encontrado con una situación como esta un par de veces:¿Qué sucede cuando uno coloca un punto y coma después de una condición de ciclo while?

while (true) { 

while (age == 5); //What does this semi-colon indicate? 
//Code 
//Code 
//Code 

} 

El while(true) indica que este es un bucle infinito, pero tengo problemas para entender lo que el punto y coma después de comprobar la while logra, ISN' T es equivalente a esto ?:

while (age == 5) { } 

//Code 
//Code 

En otras palabras, significa que el bucle while es inútil ya que nunca entra en el bloque?

+2

¿Estás preguntando sobre C o C#? Marcó la pregunta con ambos. – Oded

+0

Tengo una pista ... lógicamente no haré nada – craig1231

+0

Lo he visto ocurrir en ambos, ¿se comporta de manera diferente en ambos idiomas? –

Respuesta

22
while (age == 5);  // empty statement 

es equivalente a

while (age == 5) { } // empty block 

Actualización: Incluso si no hay cuerpo para ejecutar, no significa que el bucle termina. En su lugar, simplemente repetirá repetidamente sobre el condicional (que puede tener o depender de los efectos secundarios) hasta que se cumpla. Aquí es la forma equivalente con un goto:

loop: 
if (age == 5) 
    goto loop; 

Este constructo es veces utilizado como un busy-loop esperando en una bandera para ser cambiado en el código de roscado. (El uso exacto y la validez varía un buen poco por el lenguaje, algoritmo, y el entorno de ejecución.)

encuentro el uso de ; para un "bloque vacío" comunicado vacía una construcción cuestionable utilizar debido a problemas de esta manera:

while (age == 5); { 
    Console.WriteLine("I hate debugging"); 
} 

(he visto este error varias veces antes, cuando se añadió un nuevo código.)

feliz de codificación.

+0

Eso es lo que pensé, lo que me confunde es que lo he visto innumerables veces para ilustrar problemas de sincronización de subprocesos múltiples. Dudo que sea un error ya que se repite. –

+0

@Sean Es una sintaxis equivalente. Presumiblemente 'age' es (" volátil "y) establecido por otro hilo, por lo que no es necesariamente un" error "usar este modismo (pero yo argumento contra el constructo específico). –

+0

Leí en alguna parte que el compilador puede optimizar bucles infinitos como este; déjame ver si puedo encontrar dónde leo esto ... –

1

while (age == 5); se atasca en un bucle infinito. En c ; es un terminador nulo. El compilador asume que el ciclo anterior tiene solo una declaración que es ; que hace que el ciclo se itere infinitamente.

1

una declaración que consta de tan sólo

;

es una instrucción nula. Es lo mismo que un bloque (también llamado instrucción compuesta) sin nada dentro

{ 
} 

Ambos no realizan ninguna operación.

0

Si ponemos ; en cualquier lugar significa null declaración (declaración que no hace nada).

Cuando escribimos

while(true); 

Significa un bucle mientras que una declaración de que no hace nada.Es similar a la declaración

while(true) 
i++; 

Aquí no es null pero en el caso anterior declaración fue null.

Cuestiones relacionadas