español - enhanced for loop java
¿Cuál es la diferencia entre while(x=false) y while(! X) en Java? (8)
"while (done = false)" es igual a "done = false; while (done)"
Debe escribirse como "while (done == false)" o "while (false == done)".
Pero aún así,! Done es el código más legible, dice "NO HECHO"
Lo siento, soy nuevo en Java, por lo que esta pregunta podría no estar clara.
Hace poco estuve lidiando con encerrar una instrucción try y catch en un ciclo while, porque quería asegurarme de que la entrada del evento quedara incluida en el resto del programa.
Me encontré con un problema donde usar un signo de exclamación (!) Delante de una variable en las condiciones while (por ejemplo, while (! Done)) en lugar de usar = false (por ejemplo, while (done = false)) cambia la forma en que mi programa carreras.
El primero (! Done) da como resultado que las instrucciones try y except se ejecuten como se esperaba. El último (done = false) no lo hace, simplemente saltándolos y pasando a la siguiente parte del código.
¡Tenía la impresión de que! antes de una variable significaba lo mismo que var = falso.
¿Estoy equivocado?
Aquí hay un ejemplo:
import java.util.Scanner;
public class TestOne {
public static void main(String args[]) {
Scanner input = new Scanner(System.in);
int num;
boolean inputDone = false;
while (!inputDone) {
try {
System.out.print("Enter in a number here: ");
num = input.nextInt();
inputDone = true;
}
catch (Exception e) {
System.out.println(e);
System.exit(0);
}
}
System.out.println("Success!");
}
}
Actualmente, compilar y ejecutar el programa funcionará sin problemas: me pedirá un número, escribir una letra o un número realmente largo hará que imprima el tipo de excepción y salga. Escribir un número normal hace que se imprima ¡Éxito!
Por otro lado, si tuviera que reemplazar! InputDone con inputDone = false, simplemente imprime Success! cuando ejecuto el programa
¿Alguien puede explicarme la diferencia entre el! y las = declaraciones falsas en un ciclo while?
Como muchos otros han señalado, has hecho un tipeo ==
. Más interesantes son los problemas que rodean esto.
Para el lenguaje diseñado: alentar los efectos secundarios en las expresiones es malo. Usar el símbolo ==
para representar matemática =
no es una buena opción.
En términos de legibilidad,! Done lee mucho mejor que done == false
- queremos "no hecho" (mejor, IMO, sería "hasta que termine" en lugar de "mientras no termine"). Aunque los novatos (perpetuos) a menudo escriben la redundante someCondition == true
.
Es una buena idea hacer que las variables sean final
, aunque claramente no es factible en esta situación. Sin embargo, podemos eliminar la bandera por completo mediante el uso de una declaración de interrupción. Una opinión minoritaria sigue una regla de salida única de una sola entrada (SESE), en la que se prohíbe el corte, lo que haría este ejemplo más complicado (necesitaría una prueba para ver si el texto era un int
válido, o en este caso, mover el cuerpo en el bucle.
El enunciado x = false
es una tarea: está configurando x en falso. Sin embargo, las afirmaciones x == false
y !x
son las mismas. El enunciado x == false
compara x con falso y será verdadero si el valor de x
es falso y falso si el valor de x
es verdadero. La instrucción !x
dará como resultado la negación del valor de x
.
En su código, si reemplaza while (!inputDone)
con while(inputDone == false)
, obtendrá el comportamiento esperado.
Necesita usar ==
lugar de =
para las comparaciones.
Tenga en cuenta la diferencia entre done = false
y done == false
. El primero asigna done
para ser false
y se evalúa como false
, el segundo compara done
con false
y es exactamente idéntico a !done
.
Entonces si usas:
while (done = false)
{
// code here
}
Luego done
se establece en false
y el código dentro del ciclo while no se ejecuta en absoluto.
La expresion:
x = false
significa asignar x
el valor false
.
Después de que esto suceda en su while()
, entonces evalúa x
, que es false
para que no ingrese al bucle en absoluto.
Por otra parte:
while (!x)
significa "siempre que! x sea verdadero, continúe ingresando al bucle". ya que !x
significa "el opuesto de x". Entonces, siempre que x
sea falso, el ciclo continuará
Muchos ya han señalado su mal uso de =
vs. ==
. Me gustaría señalar que ejecutar una herramienta de análisis de código estático como Findbugs lo habría encontrado de inmediato.
Ver QBA: Método asigna booleano literal en expresión booleana
Otras respuestas han aludido al hecho de que escribir x == false
y x == true
son malos estilos. Hay tres razones para esto:
- Concisión: suponiendo que se encuentra en un contexto donde se requiere un Booleano, y "x" es un Booleano, son menos caracteres para escribir
x
quex == true
, o!x
quex == false
. - Convención: los programadores experimentados en Java (o C, C ++, C # y la mayoría de los demás lenguajes) esperan ver
x
lugar dex == true
, y!x
lugar dex == false
. - Robustez: en Java, las sentencias condicional y de bucle requieren todas una expresión de valor booleano en la condición. Si
y
no es un booleano, entonces un error tipográfico de la formaif (y = foo) {
dará un error de compilación en Java. Pero siy
es un booleano, entoncesif (y = foo) {
no da un error de compilación. Por lo tanto, al evitar==
para booleanos evitará configurarse para una gran cantidad de errores derivados de errores tipográficos.