Oharra
Baimena behar duzu orria atzitzeko. Direktorioetan saioa has dezakezu edo haiek alda ditzakezu.
Baimena behar duzu orria atzitzeko. Direktorioak alda ditzakezu.
Los operadores lógicos comparan Boolean
expresiones y devuelven un Boolean
resultado. Los And
operadores , Or
, AndAlso
, OrElse
y Xor
son binarios porque toman dos operandos, mientras que el Not
operador es unario porque toma un único operando. Algunos de estos operadores también pueden realizar operaciones lógicas bit a bit en valores enteros.
Operador lógico unario
El operador "Not" realiza la negación lógica en una Boolean
expresión. Produce lo contrario lógico de su operando. Si la expresión se evalúa como True
, devuelve Not
False
; si la expresión se evalúa como False
, Not
devuelve True
. Esto se ilustra en el siguiente ejemplo:
Dim x, y As Boolean
x = Not 23 > 14
y = Not 23 > 67
' The preceding statements set x to False and y to True.
Operadores lógicos binarios
El operador And realiza una combinación lógica en dos Boolean
expresiones. Si ambas expresiones se evalúan como True
, entonces And
devuelve True
. Si al menos una de las expresiones se evalúa como False
, And
devuelve False
.
El operador Or realiza la disjunción lógica o la inclusión en dos Boolean
expresiones. Si cualquiera de las expresiones se evalúa como True
, o ambas se evalúan como True
, devuelve Or
True
. Si ninguna expresión se evalúa como True
, Or
devuelve False
.
El operador Xor realiza la exclusión lógica en dos Boolean
expresiones. Si exactamente una expresión se evalúa como True
, pero no ambas, Xor
devuelve True
. Si ambas expresiones se evalúan como True
o ambas se evalúan como False
, Xor
devuelve False
.
En el ejemplo siguiente se ilustran los And
, Or
y Xor
operadores.
Dim a, b, c, d, e, f, g As Boolean
a = 23 > 14 And 11 > 8
b = 14 > 23 And 11 > 8
' The preceding statements set a to True and b to False.
c = 23 > 14 Or 8 > 11
d = 23 > 67 Or 8 > 11
' The preceding statements set c to True and d to False.
e = 23 > 67 Xor 11 > 8
f = 23 > 14 Xor 11 > 8
g = 14 > 23 Xor 8 > 11
' The preceding statements set e to True, f to False, and g to False.
Cortocircuito de operaciones lógicas
El operador AndAlso es muy similar al And
operador , en que también realiza la conjunción lógica en dos Boolean
expresiones. La diferencia clave entre los dos es que AndAlso
presenta un comportamiento de cortocircuito. Si la primera expresión de una AndAlso
expresión se evalúa como False
, la segunda expresión no se evalúa porque no puede modificar el resultado final y AndAlso
devuelve False
.
Del mismo modo, OrElse (Operador) realiza una disyunción lógica de cortocircuito en dos expresiones Boolean
. Si la primera expresión de una OrElse
expresión se evalúa como True
, la segunda expresión no se evalúa porque no puede modificar el resultado final y OrElse
devuelve True
.
Ventajas y desventajas del cortocircuito
El cortocircuito puede mejorar el rendimiento al no evaluar una expresión que no puede modificar el resultado de la operación lógica. Pero si esa expresión realiza acciones adicionales, el cortocircuito omite esas acciones. Por ejemplo, si la expresión incluye una llamada a un Function
procedimiento, no se llama a ese procedimiento si la expresión está cortocircuitada y no se ejecuta ningún código adicional contenido en .Function
Por lo tanto, la función solo se puede ejecutar ocasionalmente y es posible que no se pruebe correctamente. O bien, la lógica del programa puede depender del código en el Function
.
En el ejemplo siguiente se muestra la diferencia entre And
, Or
y sus equivalentes de cortocircuito.
Dim amount As Integer = 12
Dim highestAllowed As Integer = 45
Dim grandTotal As Integer
If amount > highestAllowed And checkIfValid(amount) Then
' The preceding statement calls checkIfValid().
End If
If amount > highestAllowed AndAlso checkIfValid(amount) Then
' The preceding statement does not call checkIfValid().
End If
If amount < highestAllowed Or checkIfValid(amount) Then
' The preceding statement calls checkIfValid().
End If
If amount < highestAllowed OrElse checkIfValid(amount) Then
' The preceding statement does not call checkIfValid().
End If
Function checkIfValid(ByVal checkValue As Integer) As Boolean
If checkValue > 15 Then
MsgBox(CStr(checkValue) & " is not a valid value.")
' The MsgBox warning is not displayed if the call to
' checkIfValid() is part of a short-circuited expression.
Return False
Else
grandTotal += checkValue
' The grandTotal value is not updated if the call to
' checkIfValid() is part of a short-circuited expression.
Return True
End If
End Function
Observe que en el ejemplo anterior no se ejecuta algún código importante dentro de checkIfValid()
si la llamada está cortocircuitada. La primera instrucción If
llama a checkIfValid()
aunque 12 > 45
devuelve False
, porque And
no está cortocircuitada. La segunda If
instrucción no llama a checkIfValid()
, porque cuando 12 > 45
devuelve False
, AndAlso
cortocircuita la segunda expresión. La tercera instrucción If
llama a checkIfValid()
aunque 12 < 45
devuelve True
, porque Or
no está cortocircuitada. La cuarta If
instrucción no llama a checkIfValid()
, porque cuando 12 < 45
devuelve True
, OrElse
cortocircuita la segunda expresión.
Operaciones a nivel de bits
Las operaciones bit a bit evalúan dos valores enteros en formato binario (base 2). Comparan los bits en las posiciones correspondientes y, a continuación, asignan valores en función de la comparación. En el ejemplo siguiente se muestra el And
operador .
Dim x As Integer
x = 3 And 5
En el ejemplo anterior se establece el valor de x
en 1. Esto sucede por los siguientes motivos:
Los valores se tratan como binarios:
3 en formato binario = 011
5 en formato binario = 101
El
And
operador compara las representaciones binarias, una posición binaria (bit) a la vez. Si ambos bits en una posición determinada son 1, se coloca un 1 en esa posición en el resultado. Si cualquiera de los bits es 0, se coloca un 0 en esa posición en el resultado. En el ejemplo anterior, esto funciona de la siguiente manera:011 (3 en formato binario)
101 (5 en formato binario)
001 (resultado, en formato binario)
El resultado se trata como decimal. El valor 001 es la representación binaria de 1, por lo que
x
= 1.
La operación bit a bit Or
es similar, salvo que se asigna un 1 al bit de resultado si uno o ambos de los bits comparados es 1.
Xor
asigna un 1 al bit de resultado si exactamente uno de los bits comparados (no ambos) es 1.
Not
toma un único operando e invierte todos los bits, incluido el bit de signo, y asigna ese valor al resultado. Esto significa que, para los números positivos firmados, Not
siempre devuelve un valor negativo y, para los números negativos, Not
siempre devuelve un valor positivo o cero.
Los operadores AndAlso
y OrElse
no admiten operaciones bit a bit.
Nota:
Las operaciones bit a bit solo se pueden realizar en tipos enteros. Los valores de punto flotante deben convertirse en tipos enteros antes de que la operación bit a bit pueda continuar.