这将按预期工作:
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
但从我的观点来看,这看起来很可怕。是否存在更正确的方法?
答案 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
说明
当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
列会在原始代码中显示消息框。 Desired MsgBox
=是你想要发生的事情。 T1
和T2
是您的状况的部分计算。 T1 and T2
是您病情的最终值。
最后一行显示了您希望MsgBox出现的唯一状态;当a
等于niether aaa
和undefined
且b
不等于bbb
和undefined
时。
因此,我们可以通过将a
初始化为" aaa"来简化逻辑。和b
到" bbb"。实际上,我们通过使两个值(" aaa"和undefined
)等效,将每个变量的两个条件组合成一个条件。
我希望这是有道理的