2010-09-13 32 views
16

¿alguien sabe por qué:operador lógico OR vs operador binario OR

if (false && true || true) { 
     System.out.println("True"); 
} else { 
     System.out.println("False"); 
} 

Imprimir "verdadera"

if (false && true | true) { 
      System.out.println("True"); 
    } else { 
      System.out.println("False"); 
    } 

Imprimir "Falso"

+4

Hubo una respuesta correcta aquí por colin que se volcó como loco. No quiero el mismo destino, así que lo publicaré como comentario: & y | en un contexto booleano no son operadores bit a bit, sino operadores booleanos ansiosos (no hay cortocircuito, ambos lados siempre serán evaluados). Vea esto: http://en.wikipedia.org/wiki/Short-circuit_evaluation#Support_in_common_programming_languages ​​ –

+1

Lo extraño es que no puedo encontrar ningún documento oficial de Sun donde | y se mencionan como operadores lógicos (pero es parte del examen SCJP6) –

+0

@seanizer: Todavía hay una respuesta correcta aquí. (Dos de ellos, de hecho.) :-) Ya sea que estén en modo bit o no en booleanos, realmente no es el punto * aquí *, el '|' tiene precedencia más alta independientemente y es por eso que el OP está viendo el comportamiento que él/ella está preguntando acerca de. –

Respuesta

16

Debido a operator precedence. En su primer ejemplo, el && se hace primero, y luego el ||. Pero el OR a nivel de bits tiene mayor prioridad, por lo que en el segundo ejemplo se realiza primero el |, luego el &&.

+4

¿Le importaría al infractor ofrecer comentarios útiles? –

20

En el primer caso & & tiene mayor prioridad que || operador, por lo que la expresión se evalúa como if ((false && true) || true) y obtiene True.

En el segundo caso, el operador O bit a bit tiene una precedencia mayor que & & por lo que la expresión se evalúa como if (false && (true | true)) y obtiene False.

+0

No es un operador bit a bit en este contexto. Se evaluará toda la expresión if (false && (true | true)). ¿Quieres alguna prueba (de ambas declaraciones)? –

+1

@Pawel: si es a nivel de bits o no realmente no importa en el contexto de la pregunta del OP. '|' aún tiene prioridad sobre '&&', por lo que la primera operación es 'true | true' que es 'true', que luego se alimenta en' false && true', que es por supuesto 'false'. Todo esto de si '|' está siendo bitwise cuando se aplica a booleanos está fuera del punto y en su mayoría semántica en cualquier caso (un operador lógico bit a bit aplicado a un solo bit, que es conceptualmente un 'boolean', es un ... operador lógico!). :-) –

+0

&& y son ambos en modo bit y ambos lógicos en un contexto booleano, pero && tiene una precedencia mayor que & (o |) –

Cuestiones relacionadas