java compiler-errors scjp

java - Confundirse con== y=en la declaración "if"



compiler-errors scjp (5)

En Java, no tienes un casting implícito. Entonces valores no booleanos o no transformados automáticamente a booleanos.

En el primer caso, el resultado de las instrucciones es un int, que no es booleano, lo cual no funcionará. El último caso, el resultado es booleano, que se puede evaluar en una instrucción if.

Sé que no podemos usar el operador de asignación en las declaraciones if en java, ya que lo usamos en otros pocos idiomas.

es decir

int a; if(a = 1) { }

dará un error de compilación.

pero el siguiente código funciona bien, ¿cómo?

boolean b; if(b = true) { }

EDITAR: ¿Es esta la excepción para decidir que la asignación no se puede usar en la instrucción if?


La razón por la cual el segundo código funciona bien es porque está asignando ''b'' el valor de verdadero y luego comparando para ver si b es verdadero o falso. La razón por la que puede hacer esto es porque puede hacer operadores de asignación dentro de una instrucción if, Y puede comparar contra un booleano por sí mismo. Sería lo mismo que hacer si (verdadero).


La regla no es que "la asignación no se pueda usar en una sentencia if ", sino que "la condición en una instrucción if debe ser de tipo boolean ". Una expresión de asignación produce un valor del tipo que se le asigna, por lo que Java solo permite la asignación en una sentencia if si está asignando un valor boolean .

Esta es una buena razón por la que se debe evitar el estilo if (foo == true) , y en su lugar simplemente escribir if (foo) .


Para if necesita una expresión que evalúa a boolean . b = true evalúa a boolean pero a = 1 evalúa a int ya que las asignaciones siempre evalúan los valores asignados.


Porque el "resultado" de una tarea es el valor asignado ... por lo que sigue siendo una expresión boolean en el segundo caso. if expresiones requieren que la condición sea una expresión boolean , que se cumple por el segundo pero no por el primero. Efectivamente, tus dos fragmentos son:

int a; a = 1; if (a) { }

y

boolean b; b = true; if (b) { }

¿Está claro a partir de esa expansión que la segunda versión compilará pero no la primera?

Esta es una razón para no hacer comparaciones con verdadero y falso directamente. Así que siempre escribiría if (b) lugar de if (b == true) y if (!b) lugar de if (b == false) . Todavía tiene problemas con if (b == c ) cuando c son variables boolean , hay un error tipográfico que puede causar un problema. Sin embargo, no puedo decir que me haya pasado alguna vez.

EDITAR: Respondiendo a su edición: las asignaciones de todo tipo se pueden usar en sentencias if , y while loops, etc., siempre que la expresión de condición general sea boolean . Por ejemplo, puede tener:

String line; while ((line = reader.readLine()) != null) { // Do something with a line }

Aunque generalmente evito los efectos secundarios en las condiciones, esta expresión particular a menudo es útil para el ejemplo que se muestra arriba, o usando InputStream.read . Básicamente es "mientras que el valor que leí es útil, úselo".