2012-06-03 33 views
8

VBScript'teki bitsel karşılaştırmalar içeren aşağıdaki iki conditionals düşünün: Boole Değil operatörü

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" 

Ben çıkışı olması gerektiğini düşünüyorum:

yes 
no 

Ama asıl çıkışı:

yes 
yes 

Bir saniye bekleyin, the Not operator is supposed to perform logical negation on an expression. true'un mantıksal olumsuzlaması, bildiğim kadarıyla false. Bu sözü yerine getirmediğine karar vermeli miyim? Nasıl ve neden ve burada neler oluyor? Varsa, mantık nedir?

+2

Belirtilen bağlantının sözler bölümüne bakın, nerede yazdığını okuyun. Ayrıca, Not işleci herhangi bir değişkenin bit değerlerini tersine çevirir ve aşağıdaki tabloya göre sonuçta ilgili bit'i ayarlar ..._ Özet olarak, boolean işlenenler için bir boolean sonucu elde edersiniz, sayısal ifade için sayısal sonuç elde edersiniz. –

+0

@SalmanA, bunu cevap olarak kabul ediyorum. Hatam 'Not' ile değil,' And' ile başladı ve çevreleyen 'Not' yüzünden boolean olacağını düşündüğümde sayısal bir sonuç verdi. – Lumi

cevap

11

VBScript AND operator bir mantıksal VE her iki işlenen (Yanlış, Doğru) boolean ise işlem yapıyor - - C (stil) dili && operatörüne benzer. Her iki işlenen de sayısalsa, bunun yerine bit VE işlemi - C dilini & işlecine benzer şekilde gerçekleştirecektir.

İşlenenler karışık türdeyse, boolean değeri bir sayıya dönüştürülür - False = 0, True = -1 (sürpriz!) Ardından bit ve AND işlemi gerçekleştirilir.aşağıdaki gibi

Yani örnek değerlendirir:

Eğer VBScript NOT operator çalışır, böyle bir sayısal işlenen C dilinde ! operatörü ve bitwise tamamlayıcı gibi bir boolean işlenen üzerinde mantıksal değil nasıl performans merak durumda
' 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 

C dili ~ işleci.

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

Not: En VBScript operatörleri olduğu gibi, bir Null işlenen Null dönmek için operatöre neden İşlenenlerin üzerinde mantıki işlemler zorlamak istiyorum durumda

, işlenen döküm için VBScript CBool function kullanın. Null, If yapısında kullanıldığında alışılmadık bir şekilde davranır.

6

Eric Lippert's blog: Not Logical Is VBScript adresindeki soruma cevabı buldum. Kardeşleri gibi Not işlecini kapatır, aslında bir boolean işleci değil. MSDN üzerinde

And, Or, Not and Xor are filed under Logical Operators.

Ama Eric Lippert Bitwise olarak etiketler ve mantıksal aslında çalışıyoruz nasıl söylemez çünkü benim gibi insanlar içine aptal böylece, MSDN'deki tıpkı mantıksal daha iyi bir açıklama var boolean operatörlerine sahip olmadıklarına inanıyorlar. Ve bu büyük bir tuzak.

Onları ne istersem sahip olmak için aşağıdaki gibi benim ifadeleri yeniden yazmak zorunda kalacak:

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" 

Bu yes ve olması gerektiği gibi daha sonra no basar.

Güncelleme: Yukarıdaki durum bu durum için işe yarıyor gibi görünmekle birlikte, kesinlikle gitmek için bir yol değil. Sorun, kontrol etmek istediğimin ne olduğunu anlamaktır. Yukarıdaki kod açıklığa kavuşturmuyor. Bir bit karşılaştırması ve sonuçta 0'dan büyük bir sayısal karşılaştırma, bir boole denetimi ile eşdeğer değildir.

bu soruna nihai çözüm olarak Salman A'nın CBool öneri benimser aşağıdaki kodu, düşünün:

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