Me pregunto por qué usamos OR lógico ||
entre dos booleanos, no OR bit a bit |
, aunque ambos funcionan bien.
Quiero decir, mira lo siguiente:
if(true | true) // pass
if(true | false) // pass
if(false | true) // pass
if(false | false) // no pass
if(true || true) // pass
if(true || false) // pass
if(false || true) // pass
if(false || false) // no pass
¿Podemos usar en |
lugar de ||
? Lo mismo con &
y &&
.
java
bitwise-operators
Eng.Fouad
fuente
fuente
||
y&&
cortocircuito mientras que|
y&
están ansiosos.&&
y||
, pero nunca&
|
. Si está haciendo algo que depende de los efectos secundarios, no veo por qué usaría algo así,(a & b | c)
ya que alguien podría pensar fácilmente "Puedo optimizar esto usando las versiones en cortocircuito".Respuestas:
Si usa los formularios
||
y&&
, en lugar de los|
y&
formularios de estos operadores, Java no se molestará en evaluar solo el operando de la derecha.Es cuestión de si quieres hacer un cortocircuito en la evaluación o no, la mayoría de las veces lo deseas.
Una buena manera de ilustrar los beneficios del cortocircuito sería considerar el siguiente ejemplo.
Otro beneficio, como mencionaron Jeremy y Peter, para el cortocircuito es la verificación de referencia nula:
más información
fuente
foo != null && foo.hasBar()
foo != null && foo.hasBar()
) o más rápidas (b || foo.timeConsumingCall()
). Sin embargo, el 99% de los desarrolladores no deberían preocuparse por este nivel de microoptimización.string == null || string.isEmpty()
;)|
no realiza evaluaciones de cortocircuito en expresiones booleanas.||
dejará de evaluar si el primer operando es verdadero, pero|
no lo hará.Además,
|
se puede usar para realizar la operación bit-OR en valores de byte / short / int / long.||
no puedo.fuente
Entonces, para construir sobre las otras respuestas con un ejemplo, el cortocircuito es crucial en las siguientes comprobaciones defensivas:
Usar
|
y, en&
cambio, podría provocar queNullPointerException
se arroje aquí.fuente
foo
. El "ejemplo canónico" de Peter Lawrey es el mejor.Lógico
||
y&&
verifique el lado derecho solo si es necesario. El|
y&
verifique ambos lados cada vez.Por ejemplo:
Reescribirlo:
Otro ejemplo:
Reescribirlo:
fuente
Observe también una trampa común: los operadores no perezosos tienen prioridad sobre los flojos, por lo que:
Tenga cuidado al mezclarlos.
fuente
Además del cortocircuito, otra cosa a tener en cuenta es que realizar una operación lógica bit a bit en valores que pueden ser distintos de 0 o 1 tiene un significado muy diferente al de la lógica condicional. Si bien generalmente es lo mismo para
|
y||
, con&
y&&
obtiene resultados muy diferentes (por ejemplo,2 & 4
es 0 / falso mientras2 && 4
es 1 / verdadero).Si lo que obtienes de una función es en realidad un código de error y estás probando que no es 0, esto puede ser bastante importante.
Este no es un problema tan grande en Java donde tiene que escribir explícitamente en booleano o comparar con 0 o similar, pero en otros lenguajes con una sintaxis similar (C / C ++ et al) puede ser bastante confuso.
Además, tenga en cuenta que & y | solo puede aplicarse a valores de tipo entero, y no todo lo que puede ser equivalente a una prueba booleana. Nuevamente, en lenguajes que no son Java, hay bastantes cosas que se pueden usar como booleanos con una
!= 0
comparación implícita (punteros, flotantes, objetos con unoperator bool()
, etc.) y los operadores bit a bit casi siempre no tienen sentido en esos contextos.fuente
La única vez que usaría
|
o en&
lugar de||
o&&
es cuando tiene expresiones booleanas muy simples y el costo del atajo (es decir, una rama) es mayor que el tiempo que ahorra al no evaluar las expresiones posteriores.Sin embargo, esta es una microoptimización que rara vez importa, excepto en el código de nivel más bajo.
fuente
|| es el lógico u operador mientras | es el bit a bit u operador.
fuente
a | b: evaluar b en cualquier caso
a || b: evalúe b solo si a se evalúa como falso
fuente
Además del hecho de que | es un operador bit a bit: || es un operador de cortocircuito: cuando un elemento es falso, no verificará los otros.
si algo es VERDADERO || no evaluará otra cosa, mientras que | lo haré Si las variables en sus declaraciones if son en realidad llamadas a funciones, usando || posiblemente está ahorrando mucho rendimiento.
fuente
fuente
Los operadores
||
y&&
se llaman operadores condicionales , mientras que|
y&
se llaman operadores bit a bit . Sirven para diferentes propósitos.Los operadores condicionales solo funcionan con expresiones que evalúan estáticamente
boolean
tanto en el lado izquierdo como en el derecho.Los operadores bit a bit funcionan con cualquier operando numérico.
Si desea realizar una comparación lógica, debe usar operadores condicionales , ya que agregará algún tipo de seguridad de tipo a su código.
fuente
|
y&
también son operadores condicionales. Por favor, vea el enlace en mi comentario a la publicación original.|
y&
se pueda utilizar como operadores de bits es un problema completamente separado.Una nota al margen: Java tiene | = pero no un || =
Un ejemplo de cuándo debes usar || es cuando la primera expresión es una prueba para ver si la segunda expresión explotaría. por ejemplo, usando un solo | en el siguiente caso podría resultar en un NPE.
fuente
Las otras respuestas han hecho un buen trabajo al cubrir la diferencia funcional entre los operadores, pero las respuestas podrían aplicarse a casi todos los lenguajes derivados de C que existen en la actualidad. La pregunta está etiquetada conJava, por lo que me esforzaré por responder específica y técnicamente para el lenguaje Java.
&
y|
pueden ser operadores enteros a nivel de bit u operadores lógicos booleanos. La sintaxis para los operadores lógicos y a nivel de bits ( §15.22 ) es:La sintaxis para
EqualityExpression
se define en §15.21 , que requiereRelationalExpression
definido en §15.20 , que a su vez requiereShiftExpression
yReferenceType
definido en §15.19 y §4.3 , respectivamente.ShiftExpression
requiereAdditiveExpression
definido en §15.18 , que continúa profundizando, definiendo la aritmética básica, operadores unarios, etc.ReferenceType
profundiza en todas las diversas formas de representar un tipo. (Si bienReferenceType
no incluye los tipos primitivos, la definición de los tipos primitivos se requiere en última instancia, ya que pueden ser el tipo de dimensión para una matriz, que es aReferenceType
.)Los operadores lógicos y a nivel de bit tienen las siguientes propiedades:
La distinción entre si el operador sirve como operador bit a bit o como operador lógico depende de si los operandos son "convertibles a un tipo integral primitivo" ( §4.2 ) o si son de tipos
boolean
oBoolean
( §5.1.8 ).Si los operandos son tipos integrales, promoción numérica binaria ( §5.6.2 ) se lleva a cabo en los dos operandos, dejando a los dos, ya sea como
long
s oint
s para la operación. El tipo de la operación será el tipo de los operandos (promocionados). En ese punto,&
será bit a bit AND,^
será bit a bit exclusivo, y|
será bit a bit inclusivo. ( §15.22.1 )Si los operandos son
boolean
oBoolean
, los operandos estarán sujetos a la conversión de unboxing si es necesario ( §5.1.8 ), y el tipo de operación seráboolean
.&
dará como resultadotrue
si ambos operandos sontrue
,^
dará como resultadotrue
si ambos operandos son diferentes, y|
dará como resultadotrue
si cualquiera de los operandos estrue
. ( §15.22.2 )Por el contrario,
&&
es el "Operador condicional y" ( §15.23 ) y||
es el "Operador condicional u" ( §15.24 ). Su sintaxis se define como:&&
es como&
, excepto que solo evalúa el operando derecho si el operando izquierdo estrue
.||
es como|
, excepto que solo evalúa el operando derecho si el operando izquierdo esfalse
.Condicional-Y tiene las siguientes propiedades:
Condicional-Or tiene las siguientes propiedades:
En resumen, como @JohnMeagher ha señalado repetidamente en los comentarios,
&
y|
son, de hecho, operadores booleanos sin cortocircuito en el caso específico de que los operandos seanboolean
oBoolean
. Con buenas prácticas (es decir: sin efectos secundarios), esta es una diferencia menor. Sin embargo, cuando los operandos no sonboolean
s oBoolean
s, los operadores se comportan de manera muy diferente: las operaciones bit a bit y lógicas simplemente no se comparan bien en el alto nivel de programación Java.fuente
1). (Expresión1 | expresión2), | El operador evaluará la expresión2 independientemente de si el resultado de la expresión1 es verdadero o falso.
Ejemplo:
2). (Expresión1 || expresión2), || El operador no evaluará la expresión2 si la expresión1 es verdadera.
Ejemplo:
fuente
|| devuelve un valor booleano OR con dos valores (es por eso que se conoce como LÓGICO o)
ES DECIR:
Devuelve verdadero si A o B es verdadero, o falso si ambos son falsos.
El | es un operador que realiza una operación bit a bit en dos valores. Para comprender mejor las operaciones bit a bit, puede leer aquí:
http://en.wikipedia.org/wiki/Bitwise_operation
fuente
Una diferencia principal es que || y && exhiben "cortocircuito", por lo que el RHS solo se evaluará si es necesario.
Por ej.
Arriba, si a es verdadero, entonces b no se probará y se ejecutará path1. Si | se usó, entonces ambos lados serían evaluados incluso si 'a' es verdadero.
Mira aquí y aquí , para un poco más de información.
Espero que esto ayude.
fuente
No cortocircuito puede ser útil. A veces quieres asegurarte de que dos expresiones evalúen. Por ejemplo, supongamos que tiene un método que elimina un objeto de dos listas separadas. Es posible que desee hacer algo como esto:
Si su método utilizara el operando condicional, no podría eliminar el objeto de la segunda lista si la primera lista devuelve falso.
No es sorprendentemente útil, y (como con la mayoría de las tareas de programación) podría lograrlo con otros medios. Pero es un caso de uso para operandos bit a bit.
fuente
La diferencia básica entre ellos es que | primero convierte los valores a binario y luego realiza el bit sabio u operación. Mientras tanto, || no convierte los datos en binario y solo realiza la expresión o en su estado original.
Leer más: http://javarevisited.blogspot.com/2015/01/difference-between-bitwsie-and-logical.html#ixzz45PCxdQhk
fuente
Cuando tuve esta pregunta, creé el código de prueba para tener una idea al respecto.
En este caso, solo cambiamos el valor del lado izquierdo de si la condición agrega a o b.
salida
"If condition executed"
Salida-
Conclusion of ||
Cuando se usa||
, el lado derecho solo verifica cuando el lado izquierdo es falso.Salida-
Salida-
Conclusion of |
Cuando lo use|
, verifique los lados izquierdo y derecho.fuente
El | = bit a bit o, || = lógica o
fuente
generalmente lo uso cuando hay un operador de incremento previo y posterior. Mira el siguiente código:
salida:
ambos
if
bloques son iguales pero el resultado es diferente. cuando exista|
, ambas condiciones serán evaluadas. Pero si es||
así, no evaluará la segunda condición, ya que la primera condición ya es verdadera.fuente
Hay muchos casos de uso que sugieren por qué debería ir en
||
lugar de hacerlo|
. Algunos casos de uso tienen que usar el|
operador para verificar todas las condiciones.Por ejemplo, si desea verificar la validación del formulario y desea mostrar al usuario todos los campos no válidos con textos de error en lugar de solo un primer campo no válido.
||
operador sería,Entonces, con el fragmento anterior, si el usuario envía el formulario con TODOS los campos vacíos, SOLO
nameField
se mostrará con un mensaje de error. Pero, si lo cambias a,Mostrará un mensaje de error apropiado en cada campo, independientemente de las
true
condiciones.fuente
Después de leer detenidamente este tema todavía no me queda claro si usarlo
|
como operador lógico es conforme a las prácticas de patrones Java.Recientemente modifiqué el código en una solicitud de extracción que aborda un comentario donde
tuvo que ser cambiado a
¿Cuál es la versión real aceptada?
¿No está interesado en una votación pero más en descubrir el estándar? Ambas versiones de código están compilando y funcionando como se esperaba
fuente
|| es un lógico oy | es un poco sabio o.
fuente
Operadores de Java
El | es bit a bit o || es lógico o
fuente
Echa un vistazo a:
http://java.sun.com/docs/books/tutorial/java/nutsandbolts/operators.html
El | es bit a bit inclusivo O
|| es lógico O
fuente
El | es un operador bit a bit. || Es un operador lógico.
Uno tomará dos bits y / o ellos.
Uno determinará la verdad (esto O aquello) Si esto es cierto o es cierto, entonces la respuesta es verdadera.
Ah, y dang personas responden estas preguntas rápidamente.
fuente