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
等于nietheraaa
或未定义
且b
既不等于bbb
也不等于未定义
时
因此,我们可以通过将a
初始化为“aaa”和b
初始化为“bbb”来简化逻辑。实际上,我们通过使两个值(“aaa”和未定义
)相等,将每个变量的两个条件组合成一个条件
我希望这是有意义的谢谢你的回答,但我的问题是,如果其中一个变量没有定义,如何避免消息。在您的示例中,如果我注释掉第一行(
;a=aaa
),消息仍将显示。那不是我想要的。更新:哦,对不起,你的实际答案是如果a和b和a!=“aaa”和b!=“bbb”
,第二个代码块只是一个添加,对吗?第二个代码块是一个替代解决方案。我补充了一个解释