`if`语句中的未定义变量

时间:2017-05-05 14:26:46

标签: autohotkey

这将按预期工作:

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 个答案:

答案 0 :(得分: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不等于bbbundefined时。

因此,我们可以通过将a初始化为" aaa"来简化逻辑。和b到" bbb"。实际上,我们通过使两个值(" aaa"和undefined)等效,将每个变量的两个条件组合成一个条件。

我希望这是有道理的