2017-05-05 3 views
0

Dies wird wie erwartet:undefinierte Variablen in `if` Anweisung

a := "111" 
b := "222" 

if (a != "aaa" and b != "bbb") 
    MsgBox, Yes 

Aber die„Ja“Nachricht auch wenn eine der Variablen angezeigt wird nicht

definiert
; a := "111" ; Commented line 
b := "222" 

if (a != "aaa" and b != "bbb") 
    MsgBox, Yes ; Since var "a" is not defined, I don't want this message box 

Hier wie ich es repariere:

; a := "111" 
b := "222" 

if ((a and b) and (a != "aaa" and b != "bbb")) 
    MsgBox, Yes 

Aber aus meiner Sicht sieht es wie etwas Schreckliches aus. Gibt es einen korrekteren Weg?

Antwort

1

Da and kommutativ ist, können Sie ohne Klammern tun:

if a and b and a != "aaa" and b != "bbb" 

ALTERNATIVE

Initialisieren Sie Variablen auf den Wert Sie testen (aaa), so dass, wenn Ihr Implementierungscode hat sie nicht ändern, werden Sie das gewünschte Ergebnis erhalten:

a=aaa 
b=bbb 

... do some stuff ... 

global a,b 
if a != "aaa" and b != "bbb" 
    MsgBox, Yes 

ERKLÄRUNG

Wenn a ist undefined, scheint es, wie Sie wollen undefined != "aaa"false irgendwie zu bewerten. Das ist das gleiche wie zu sagen Sie wollen undefined == "aaa" irgendwie zu true auswerten. Deine Logik ist dafür zu komplex.

Hier ist eine Zustandstabelle für Ihre Logik:

   Actual Desired T1  T2 
a  b  MsgBox MsgBox a!=aaa b!=bbb T1 and T2 
----- ------ ------ ------- ------ ------ ----- 
undef undef Yes  no  true true true 
undef bbb  no  no  true false false 
undef 222  Yes  no  true true true The example you didn't want 
aaa  undef no  no  false true false 
aaa  bbb  no  no  false false false 
aaa  222  no  no  false true false 
111  undef Yes  no  true true true 
111  bbb  no  no  true false false 
111  222  Yes  Yes  true true true Only one you want 

Die Actual MsgBox Spalte zeigt an, wenn das Meldungsfeld in Ihrem ursprünglichen Code erscheint. Desired MsgBox = Ja, was du wolltest. T1 und T2 sind die Teilberechnungen Ihres Zustandes. T1 and T2 ist der Endwert Ihrer Erkrankung.

Die letzte Zeile zeigt den einzigen Status, in dem die MsgBox angezeigt werden soll; wenn a gleich null ist aaa noch undefined UND b ist weder gleich bbb noch undefined.

So können wir die Logik vereinfachen, indem wir a zu "aaa" und b zu "bbb" initialisieren. In der Tat kombinieren wir Ihre beiden Bedingungen für jede Variable in einer einzigen Bedingung, indem Sie die beiden Werte ("aaa" und undefined) gleichwertig machen.

Ich hoffe, dass macht Sinn

+0

Danke für die Antwort, aber meine Frage war, wie man eine Nachricht vermeiden, wenn eine der Variablen nicht definiert ist. Wenn Sie in Ihrem Beispiel die erste Zeile auskommentieren ('; a = aaa'), wird die Nachricht weiterhin angezeigt. Das ist nicht was ich will. ** Update: ** Oh, tut mir leid, deine eigentliche Antwort war 'wenn a und b und a! =" Aaa "und b! =" Bbb "', und der zweite Codeblock ist nur ein Zusatz, oder? –

+0

der zweite Codeblock war eine alternative Lösung. Ich fügte eine Erklärung hinzu –