2017-05-05 239 views
0

預期這將工作:未定義的變量

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

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

但「是」的消息也將如果一個變量沒有被定義

; 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 

這裏是所示我如何解決它:

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

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

但從我的角度來看,它看起來像一件可怕的事情。有沒有更正確的方法?

回答

1

由於and是可交換的,你可以不用括號:

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

替代解決方案

初始化變量的值,你正在測試(AAA),所以,如果你的實現代碼不會改變它們,你會得到期望的結果:

a=aaa 
b=bbb 

... do some stuff ... 

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

說明

aundefined,好像你要undefined != "aaa"以某種方式評價來false。這就像說你想undefined == "aaa"以某種方式評估爲true。你的邏輯太複雜了。

下面是你的邏輯狀態表:

   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 

當消息框出現在您的原代碼Actual MsgBox列顯示。 Desired MsgBox =是的,你想要發生。 T1T2是您的條件的部分計算。 T1 and T2是您的病情的最終值。

最後一行顯示您希望MsgBox出現的唯一狀態;當a等於niether aaaundefinedb既不等於bbb也不等於undefined

因此,我們可以通過初始化a爲「AAA」和b至「BBB」簡化的邏輯。實際上,我們通過使兩個值(「aaa」和undefined)等價,將每個變量的兩個條件組合爲單個條件。

我希望是有道理的

+0

感謝您的答案,但我的問題是關於如何避免消息,如果一個變量未定義。在你的例子中,如果我註釋掉第一行('; a = aaa'),這個消息仍然會顯示。這不是我想要的。 **更新:**對不起,您的實際答案是'如果a和b和a!=「aaa」和b!=「bbb」',第二個代碼塊只是一個加法,對不對? –

+0

第二個代碼塊是另一種解決方案。我添加了一個解釋 –