Siempre pensé que el &&
operador en Java se usa para verificar si sus operandos booleanos lo son true
, y el &
operador se usa para realizar operaciones en dos tipos enteros.
Recientemente supe que el &
operador también se puede usar para verificar si sus operandos booleanos son true
, la única diferencia es que verifica el operando RHS incluso si el operando LHS es falso.
¿El &
operador en Java está sobrecargado internamente? ¿O hay algún otro concepto detrás de esto?
java
operators
boolean
bitwise-operators
Comunidad
fuente
fuente
Respuestas:
& <- verifica ambos operandos
&& <- deja de evaluar si el primer operando se evalúa como falso ya que el resultado será falso
(x != 0) & (1/x > 1)
<- esto significa evaluar y(x != 0)
luego evaluar y(1/x > 1)
luego hacer el &. El problema es que para x = 0 esto arrojará una excepción.(x != 0) && (1/x > 1)
<- esto significa evaluar(x != 0)
y solo si esto es cierto, entonces evaluar(1/x > 1)
si tiene x = 0, entonces esto es perfectamente seguro y no arrojará ninguna excepción si (x! = 0) se evalúa como falso, todo se evalúa directamente como falso sin evaluar el(1/x > 1)
.EDITAR:
exprA | exprB
<- esto significa evaluar,exprA
luego evaluar yexprB
luego hacer el|
.exprA || exprB
<- esto significa evaluarexprA
y solo si esto esfalse
evaluarexprB
y hacer el||
.fuente
Además de no ser un evaluador perezoso al evaluar ambos operandos, creo que las características principales de los operadores bit a bit comparan cada byte de operandos como en el siguiente ejemplo:
fuente
fuente
Depende del tipo de argumentos ...
Para argumentos enteros, el ampersand único ("&") es el operador "bit-wise AND". El doble ampersand ("&&") no está definido para nada más que dos argumentos booleanos.
Para argumentos booleanos, el ampersand simple constituye el operador "incondicional" AND lógico, mientras que el ampersand doble ("&&") es el operador "AND lógico condicional". Es decir que el ampersand único siempre evalúa ambos argumentos, mientras que el ampersand doble solo evaluará el segundo argumento si el primer argumento es verdadero.
Para todos los demás tipos de argumentos y combinaciones, debe producirse un error en tiempo de compilación.
fuente
&& es un operador de cortocircuito mientras que & es un operador AND.
Prueba esto.
fuente
es como se especifica en el JLS (15.22.2) :
El "truco" es que
&
es un operador bit a bit entero , así como un operador lógico booleano . Entonces, ¿por qué no? Ver esto como un ejemplo de sobrecarga del operador es razonable.fuente
Creo que mi respuesta puede ser más comprensible:
Hay dos diferencias entre
&
y&&
.Si usan como lógico Y
&
y&&
puede ser lógicoAND
, cuando el resultado de la expresión izquierda&
o&&
derecha es verdadero, todo el resultado de la operación puede ser verdadero.cuando
&
y&&
como es lógicoAND
, hay una diferencia:cuando se usa
&&
como lógicoAND
, si el resultado de la expresión izquierda es falso, la expresión derecha no se ejecutará.Toma el ejemplo:
Si usa
&
:Otro ejemplo más:
& se puede utilizar como operador de bits
&
se puede usar comoAND
operador Bitwise ,&&
no se puede.Desde la página wiki:
http://www.roseindia.net/java/master-java/java-bitwise-and.shtml
fuente
'&&': es un operador lógico AND que produce un valor booleano de verdadero o falso basado en la relación lógica de sus argumentos.
Por ejemplo: - Condición1 && Condición2
Si la Condición1 es falsa, entonces (Condición1 && Condición2) siempre será falsa, esa es la razón por la cual este operador lógico también se conoce como Operador de Cortocircuito porque no evalúa otra condición. Si la Condición1 es falsa, no hay necesidad de evaluar Condtiton2.
Si la Condición1 es verdadera, entonces se evalúa la Condición2, si es verdadera, el resultado general será verdadero; de lo contrario, será falso.
'&': - es un operador AND a nivel de bits. Produce un uno (1) en la salida si ambos bits de entrada son uno. De lo contrario, produce cero (0).
Por ejemplo:-
int a = 12; // la representación binaria de 12 es 1100
int b = 6; // la representación binaria de 6 es 0110
int c = (a & b); // la representación binaria de (12 y 6) es 0100
El valor de c es 4.
para referencia, consulte este http://techno-terminal.blogspot.in/2015/11/difference-between-operator-and-operator.html
fuente
&&
y||
se llaman operadores de cortocircuito. Cuando se usan, for||
- si el primer operando se evalúa comotrue
, entonces el resto de los operandos no se evalúan. Para&&
: si el primer operando se evalúa comofalse
, el resto de ellos no se evalúa en absoluto.entonces,
if (a || (++x > 0))
en este ejemplo, la variable x no se incrementará si atrue
.fuente
Con booleanos, no hay diferencia de salida entre los dos. Puede intercambiar && y & or || y | y nunca cambiará el resultado de tu expresión.
La diferencia se encuentra detrás de la escena donde se procesa la información. Cuando endereza una expresión "(a! = 0) & (b! = 0)" para a = 0 y b = 1, sucede lo siguiente:
Cuando escribe una expresión
(a != 0) && ( b != 0)
cuando a = 0 y b = 1, sucede lo siguiente:Menos pasos, menos procesamiento, mejor codificación, especialmente cuando se hacen muchas expresiones booleanas o argumentos complicados.
fuente
Además de && y || siendo cortocircuito, también considere la precedencia del operador al mezclar las dos formas. Creo que no será inmediatamente evidente para todos que resultado1 y resultado2 contienen valores diferentes.
fuente
& es un operador bit a bit más utilizado para verificar ambas condiciones porque a veces necesitamos evaluar ambas condiciones. Pero el operador lógico && pasa a la segunda condición cuando la primera condición da verdadero.
fuente
todas las respuestas son
great
, y parece que hayno
más respuestas,is needed
pero simplemente me pregunté algo sobre el&&
operador llamadodependent condition
En las expresiones que usan el operador &&, una condición, a la que llamaremos esto,
dependent condition
puede requerir que otra condición sea verdadera para que la evaluación de la condición dependiente sea significativa.En este caso, la condición dependiente debe colocarse después del operador && para evitar errores.
Considera la expresión
(i != 0) && (10 / i == 2)
. La condición dependiente(10 / i == 2)
debe serappear after
el&&
operador para evitar la posibilidad de división por cero.otro ejemplo
(myObject != null) && (myObject.getValue() == somevaluse)
y otra cosa:
&&
y||
se llama Evaluación de cortocircuito debido a que el segundo argumento se ejecuta o evalúaonly if
elfirst
argumento nonot suffice
adetermine
lavalue
de laexpression
Referencias: Java ™ How To Program (Early Objects), Décima edición
fuente