Encontré la respuesta a mi pregunta en Eric Lippert's blog: Not Logical Is VBScript. Resulta que el operador Not
, al igual que sus hermanos, no es en realidad un operador booleano .
And
, Or
, Not
and Xor
are filed under Logical Operators en MSDN.
Pero Eric Lippert los etiqueta como bit a bit, y eso es una descripción mejor que sólo lógica como en MSDN, porque lógica no dice cómo están trabajando realmente, por lo que la gente como yo te dejes engañar en creyendo que son booleanos operadores, que no lo son. Y esta es una gran trampa.
que tendría que volver a escribir mis declaraciones de la siguiente manera con el fin de que ellos hagan lo que yo quiero:
If (1 And 3) > 0 Then WScript.Echo "yes" Else WScript.Echo "no"
If Not((1 And 3) > 0) Then WScript.Echo "yes" Else WScript.Echo "no"
Esto imprime yes
y luego no
como debería.
Actualización: Si bien lo anterior parece funcionar para este caso, definitivamente no es el camino a seguir. El problema es comprender qué es lo que quiero verificar. El código anterior no lo deja claro. Una comparación bit a bit y una comparación numérica de más de 0 en el resultado no son equivalentes a una verificación booleana.
Considere el siguiente código, que adopta CBool
sugerencia de Salman A como la solución definitiva a este problema:
Option Explicit
Dim a, b
a = -3 : b = -2
If a And b Then WScript.Echo "ja" Else WScript.Echo "nein" ' bad
If (a And b) > 0 Then WScript.Echo "ja" Else WScript.Echo "nein" ' bad
If CBool(a And b) Then WScript.Echo "ja" Else WScript.Echo "nein" ' good
Mire la sección de comentarios del enlace que mencionó, lea donde dice _Además, el operador Not invierte los valores de bit de cualquier variable y establece el bit correspondiente en el resultado de acuerdo con la siguiente tabla ..._ En resumen, para los operandos booleanos obtendrá un resultado booleano, para la expresión numérica obtendrá un resultado numérico. –
@SalmanA, póngalo como respuesta para que yo pueda aceptarlo. Mi error no comenzó con 'Not' sino con' And', que arroja un resultado numérico mientras que pensé que sería booleano debido al 'No' circundante. – Lumi