2012-08-02 13 views
6

Ésta es la forma en que lo haría un bucle while:¿Es posible declarar variables dentro de una condición?

boolean more = true; 
while (more) 
{ 
    // do something 
    if (someTest()) 
    { 
    more = false; 
    } 
} 

Eso es bastante estándar. Tengo curiosidad por saber si hay una manera de hacer algo similar al siguiente código en Java: (creo que he visto algo parecido en C)

// The code below doesn't compile (obviously) 
while (boolean more = true) 
{ 
    // do something 
    if (someTest()) 
    { 
    more = false; 
    } 
} 

Sólo pido esto porque actualmente I don' me gusta la forma en que estoy definiendo la variable utilizada en la condición (en este caso: "más") fuera de el alcance del ciclo, aunque solo es relevante dentro del ciclo. No tiene sentido que se quede esperando después de que el ciclo haya terminado.


* * * * Actualización

Una idea vino a mí después de una visita a la cámara secreta Porcaline:

for (boolean more=true; more; more=someTest()) 
{ 
    // do something 
} 

No es perfecto; Está abusando del bucle for y no puedo pensar en una forma de ejecutar el bucle al menos una vez, pero está cerca ... ¿Hay alguna forma de asegurarse de que el bucle se realice más de una vez?

+1

for (boolean more = true; more; more = someTest()) ... siempre se ejecutará al menos una vez. – Pyrce

Respuesta

9

Para responder a su pregunta, literalmente, se puede hacer

for(boolean more = true; more;) { 
    more = !someTest(); 
} 

pero esto es lo mismo que

while(!someTest()); 

Si se debe ejecutar al menos una vez que usted puede hacer

do { 

} while(!someTest()); 
+2

' para (var; cond;) 'truco es útil al tratar con iteradores:' for (Iterator it = list.iterator(); it.hasNext();) {/ * hacer cosas */} ' De hecho, se recomienda en * Elemento Java eficaz 45: Minimice el alcance de las variables locales * – Xaerxess

+0

Su respuesta apareció justo cuando presenté mi actualización. ¡Gracias! ... Probablemente fue una mala idea, por mi parte, abstraer la condición como método: el ciclo solo tenía tres líneas y una de ellas estaba configurando "más", por lo que encapsularlo en un método sería excesivo. Pensé que haría la pregunta más concisa, pero en cambio la dejé abierta a interpretaciones erróneas. Mi error. – KidTempo

1

para su caso específico, usted puede reducir su código para esto:

while (true) { 
    if (someTest()) { 
    break; 
    } 
} 

En general, se puede reemplazar su declaración-ámbito exterior con un interior alcance una, pero que había necesidad de mover el condición del bucle:

while (true) { 
    boolean more=true; 
    ... 
    if (someTest()) { 
    more = false; 
    } 
    ... 
    if (!more) { 
    break; 
    } 
} 

O incluso:

do { 
    boolean more=true; 
    ... 
    if (someTest()) { 
    more = false; 
    } 
    ... 
    if (!more) { 
    break; 
    } 
} while (true); 

me gustaría opinan que la definición de su condición outsi de la vuelta es más clara.

+0

+1 o 'while (! SomeTest()) {}' –

+0

para ser honesto, no soy un gran admirador de usar 'while (true) {...}' parece una especie de escape . Además, todavía tengo pesadillas para depurar el código de spaghetti de otras personas plagado de enormes bloques de 'if (false) {...} '[estremecimiento] – KidTempo

0

KidTempo, en el ejemplo que proporcionó, creo que se volvería a inicializar cada vez más a través del ciclo. Cada vez que pasa el ciclo, el condicional se vuelve a evaluar, por lo que, suponiendo que pueda definir una variable en un condicional, la variable se reinicializaría cada vez que se reevalúe el condicional. Esto también se aplicaría a otros tipos de condicionales, por lo que diría que evite definir variables en un condicional.

Cuestiones relacionadas