2012-06-03 10 views
8

Considere los siguientes dos condicionales que involucran comparaciones a nivel de bits en VBScript:booleana No en VBScript

If  1 And 3 Then WScript.Echo "yes" Else WScript.Echo "no" 
If Not(1 And 3) Then WScript.Echo "yes" Else WScript.Echo "no" 

Creo que la salida debe ser:

yes 
no 

Pero la salida real es:

yes 
yes 

Espere un segundo, the Not operator is supposed to perform logical negation on an expression. La negación lógica de true es false, hasta donde yo sé. ¿Debo concluir que no cumple con esa promesa? ¿Cómo y por qué y qué está pasando aquí? ¿Cuál es el razonamiento, si hay alguno?

+2

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. –

+0

@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

Respuesta

11

El VBScript AND operator realiza una lógica operación Y si ambos operandos son del tipo booleano (verdadero, falso) - - algo así como el operador de lenguaje C (estilo) &&.

Si ambos operandos son numéricos, en su lugar realizará a nivel de bit AND operación - algo así como el operador de lenguaje C &.

Si los operandos son de tipos mixtos, entonces el valor booleano se convierte en un número - False = 0, True = -1 (¡sorpresa!) Seguido de una operación Y a nivel de bit.

Así que su ejemplo evalúa de la siguiente manera:

' 1 And 3 
' = &h0001 And &h0003 <- bitwise AND 
' = 1 
If 1 Then WScript.Echo "yes" Else WScript.Echo "no" ' Yes 

' Not(1 And 3) 
' = Not(1) <- see above 
' = Not(&h0001) <- bitwise NOT 
' = &hFFFE 
If -2 Then WScript.Echo "yes" Else WScript.Echo "no" ' Yes 

En caso de que usted se está preguntando cómo los VBScript NOT operator obras, realiza negación lógica en un operando booleano como el lenguaje C ! operador y complemento bit a bit de un operando numérico como el operador de idioma C ~.

En caso de que quiera forzar operaciones lógicas sobre operandos, utilice el VBScript CBool function a emitir los operandos:

If Not(CBool(1) And CBool(3)) Then WScript.Echo "yes" Else WScript.Echo "no" ' no 

Nota: Al igual que con la mayoría de los operadores de VBScript, un operando Null hace que el operador para volver Null. Null se comporta de forma inusual cuando se usa dentro de una construcción If.

6

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