Debugging VB6多IF语句异常问题

Debugging VB6多IF语句异常问题,debugging,if-statement,vb6,multiple-conditions,Debugging,If Statement,Vb6,Multiple Conditions,在带有多个条件的IF语句中遇到了一个奇怪的问题。 最后一个工作版本如下所示: If VAR1 = "SCRT" And InStr("|TEC|FIN|", "|" & VAR2 & "|")) And VAR3 = 1 Then 现在,我实现另一个条件来声明: If VAR1 = "SCRT" And InStr("|TEC|FIN|", "|" & VAR2 & "|")) And (VAR3 = 1 or VAR3 = 15) Then 使用此值: VA

在带有多个条件的
IF
语句中遇到了一个奇怪的问题。 最后一个工作版本如下所示:

If VAR1 = "SCRT" And InStr("|TEC|FIN|", "|" & VAR2 & "|")) And VAR3 = 1 Then
现在,我实现另一个条件来声明:

If VAR1 = "SCRT" And InStr("|TEC|FIN|", "|" & VAR2 & "|")) And (VAR3 = 1 or VAR3 = 15) Then
使用此值: VAR1:“(空) VAR2:“FIN” VAR3:1

这段代码在调试中运行良好。奇怪的是编译并在生产环境中运行,即使第一个条件不正常,条件也已通过

已记录要检查的值。 生产环境具有相同的文件(库)

除了条件之外,唯一改变的是本模块开头的显式选项


谢谢

无意冒犯,但这太难解析了,而且没有什么好的理由。在处理
条件时,最好使用嵌套的
If
s,尽可能将最不可能的条件放在第一位,最昂贵的测试放在最后。这一点更清楚,而且几乎可以肯定更快:

If VAR1 = "SCRT" Then
 If InStr("|TEC|FIN|", "|" & VAR2 & "|")) > 0 Then
  If (VAR3 = 1) or (VAR3 = 15) Then
这允许短路,否则在VB6中不可用。代码不会因为在一行上而运行得更快

两个变化:测试
如果Instr>0
,而不仅仅是
如果Instr
。是的,VB会将一个成功的测试评估为
True/False
,但它永远不会将该表达式的
Not
评估为
False
,总有一天会咬到你。相信它。(-):


第二个变化:我使用parens强制执行
条件的优先顺序。有规则,但如果VAR3=(1或VAR3),您可以得到类似
当您最不希望的时候,将其设置为15。

在出错时继续下一步
并且
VAR1
为空?Instr返回匹配的位置(1或5或0).And运算符在VB6中是按位的。真值是-1,所以所有位都被设置。您应该检查Instr的结果是否大于0。这将返回0或-1,您的表达式将更正确。我看到了这一点,但在本例中VB6会隐式地将任何大于0的值转换为真。这只是运气好。例如,如果您有两个Instr条件,它可能会失败。这将失败:如果InStr(“abc”,“a”)和InStr(“abc”,“b”),则OK…这是一个将被更改的更改!=)但这不是解决方案。检查>0也是更好的“防御”编程。由于它更加明确,一些未来的程序员不太可能做出破坏它的更改。我只是简化了,但这只是规则列表中许多条件之一。真正的函数有很多elseif,如果我把一个条件放在另一个条件里面,代码会很混乱。。。第一个更改:我已经将>0=D第二次更改:如果VAR3=(1或VAR3)=15,则不理解条件
。你为什么这样对父母?谢谢@FernandoMoreno——这只是一个例子,说明如果你对优先规则的理解与编译器的不同,你可能会遇到这种问题。在代码块中查找我的实际建议。明确地说:在可能出现混乱的情况下,添加参数来强制评估——这不会有任何伤害,而且,
if
s和
elseif
s的纠结通常是一个信号,表明您应该尝试不同的方法。我仍然对if InStr(“| TEC | FIN |”,“|124;”&VAR2&“|”)感到困惑:我的困惑来自一个开头(“两个结尾”)“