logicos - Operadores booleanos && y ||
operadores logicos java (3)
La respuesta sobre "short-circuiting" es potencialmente engañosa, pero tiene algo de verdad (ver más abajo). En el lenguaje R / S, &&
y ||
Solo evalúa el primer elemento en el primer argumento. Todos los demás elementos en un vector o lista se ignoran independientemente del primer valor. Estos operadores están diseñados para trabajar con la construcción if (cond) {} else{}
y para dirigir el control del programa en lugar de construir nuevos vectores. El &
y el |
los operadores están diseñados para trabajar en vectores, por lo que se aplicarán "en paralelo", por así decirlo, a lo largo del argumento más largo. Si los vectores no tienen la misma longitud, entonces se realiza el reciclaje del argumento más corto.
Cuando los argumentos a &&
o ||
se evalúan, existe un "cortocircuito" en el sentido de que si alguno de los valores en sucesión de izquierda a derecha son determinativos, las evaluaciones cesan y se devuelve el valor final.
> if( print(1) ) {print(2)} else {print(3)}
[1] 1
[1] 2
> if(FALSE && print(1) ) {print(2)} else {print(3)} # `print(1)` not evaluated
[1] 3
> if(TRUE && print(1) ) {print(2)} else {print(3)}
[1] 1
[1] 2
> if(TRUE && !print(1) ) {print(2)} else {print(3)}
[1] 1
[1] 3
> if(FALSE && !print(1) ) {print(2)} else {print(3)}
[1] 3
De acuerdo con la definición del lenguaje R , la diferencia entre &
y &&
((correspondentamente |
y ||
) es que el primero se vectoriza mientras que el segundo no.
De acuerdo con el texto de ayuda , leo la diferencia similar a la diferencia entre "And" y "AndAlso" (correspondientemente "Or" y "OrElse") ... Significado: Eso no todas las evaluaciones si no tienen que ser (es decir, A o B o C siempre es verdadero si A es verdadero, así que deja de evaluar si A es verdadero)
¿Podría alguien arrojar luz aquí? Además, ¿hay un AndAlso y OrElse en R?
Los más cortos están vectorizados, lo que significa que pueden devolver un vector, como este:
((-2:2) >= 0) & ((-2:2) <= 0)
# [1] FALSE FALSE TRUE FALSE FALSE
La forma más larga evalúa de izquierda a derecha examinando solo el primer elemento de cada vector, por lo que lo anterior da
((-2:2) >= 0) && ((-2:2) <= 0)
# [1] FALSE
Como dice la página de ayuda, esto hace que la forma más larga sea "apropiada para la programación de flujo de control y [es] típicamente preferida en las cláusulas if".
Por lo tanto, desea utilizar las formas largas solo cuando esté seguro de que los vectores son de longitud uno.
Debe estar absolutamente seguro de que sus vectores son solo de longitud 1, como en los casos en que son funciones que devuelven solo longitud 1 booleanos. Desea utilizar las formas cortas si los vectores son posiblemente longitud> 1. Por lo tanto, si no está absolutamente seguro, debe verificar primero, o usar el formulario corto y luego usar all
para reducirlo a la longitud de uno para usarlo en los estados de flujo de control, como if
.
Las funciones all
y any
se usan a menudo en el resultado de una comparación vectorizada para ver si todas o alguna de las comparaciones son ciertas, respectivamente. Los resultados de estas funciones seguramente serán de longitud 1, por lo que son apropiados para usar en las cláusulas if, mientras que los resultados de la comparación vectorizada no lo son. (Aunque esos resultados serían apropiados para su uso en ifelse
.
Una última diferencia: el &&
y ||
solo evalúe todos los términos que necesiten (lo que parece ser lo que se entiende por cortocircuito). Por ejemplo, aquí hay una comparación que usa un valor indefinido a
; si no fuera cortocircuito, como &
y |
no, daría un error
a
# Error: object ''a'' not found
TRUE || a
# [1] TRUE
FALSE && a
# [1] FALSE
TRUE | a
# Error: object ''a'' not found
FALSE & a
# Error: object ''a'' not found
Finalmente, vea la sección 8.2.17 en The R Inferno , titulada "and and andand".
&&
y ||
Son lo que se llama "cortocircuito". Eso significa que no evaluarán el segundo operando si el primer operando es suficiente para determinar el valor de la expresión.
Por ejemplo, si el primer operando de &&
es falso, entonces no tiene sentido evaluar el segundo operando, ya que no puede cambiar el valor de la expresión ( false && true
y false && false
son falsos). Lo mismo vale para ||
cuando el primer operando es verdadero
Puedes leer más sobre esto aquí: http://en.wikipedia.org/wiki/Short-circuit_evaluation Desde la tabla en esa página puedes ver que &&
es equivalente a AndAlso
en VB.NET, a lo que supongo que te refieres .