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

Autohotkey `if`语句中未定义的变量,autohotkey,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

这将按预期工作:

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

但在我看来,这看起来很糟糕。还有更正确的方法吗?

由于
是可交换的,您可以不使用括号:

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

解释

a
undefined
时,您似乎想要
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
列将显示<代码>所需的MsgBox=是您希望发生的事情
T1
T2
是对您的病情进行的部分计算<代码>T1和T2是您的状况的最终值

最后一行显示您希望MsgBox显示的唯一状态;当
a
等于niether
aaa
未定义
b
既不等于
bbb
也不等于
未定义

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


我希望这是有意义的

谢谢你的回答,但我的问题是,如果其中一个变量没有定义,如何避免消息。在您的示例中,如果我注释掉第一行(
;a=aaa
),消息仍将显示。那不是我想要的。更新:哦,对不起,你的实际答案是
如果a和b和a!=“aaa”和b!=“bbb”
,第二个代码块只是一个添加,对吗?第二个代码块是一个替代解决方案。我补充了一个解释