【问题标题】:VB6 multiple IF statement bizarre issueVB6多重IF语句离奇问题
【发布时间】:2017-02-23 14:48:14
【问题描述】:

在具有多个条件的 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:“鳍” VAR3:1

它将在调试中正常工作的代码。奇怪的是在生产环境编译运行,条件通过了,第一个条件不ok。

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

除了条件之外唯一改变的是这个模块开头的 Option Explicit。

谢谢!!

【问题讨论】:

  • On Error Resume NextVAR1 为空?
  • Instr 返回匹配的位置(1 或 5 或 0)。 And 运算符在 VB6 中是按位的。 TRUE 值为 -1,因此所有位都已设置。您应该检查 Instr 的结果是否 > 0。这将返回 0 或 -1,并且您的表达式会更正确。
  • 我看到了这个,但在这种情况下 vb6 隐式地将任何值 >0 转换为 True。
  • 只能靠运气。例如,如果您有两个 Instr 条件,它可能会失败。这将失败: If InStr("abc", "a") And InStr("abc", "b") Then
  • 好的....这是一个改变,它将被改变! =) 但这不是分辨率。

标签: debugging if-statement vb6 multiple-conditions


【解决方案1】:

无意冒犯,但这实在是太难解析了,而且没有充分的理由。在处理And 条件时,最好使用嵌套的Ifs,将最不可能的条件放在最前面,在可能的情况下将最昂贵的测试放在最后。这更清晰,而且几乎可以肯定更快:

If VAR1 = "SCRT" Then
 If InStr("|TEC|FIN|", "|" & VAR2 & "|")) > 0 Then
  If (VAR3 = 1) or (VAR3 = 15) Then

这允许短路,否则在 VB6 中不可用。代码不会因为一行而跑得更快。

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

第二个变化:我使用括号来强制Or 条件的优先顺序。有一些规则,但是当你最不期待的时候,你可能会得到类似If VAR3 = (1 Or VAR3) = 15 的东西。直言不讳,没有意外。

【讨论】:

  • 检查 > 0 也是更好的“防御性”编程。由于它更明确,一些未来的程序员不太可能做出破坏它的更改。
  • 我在简化,但这只是规则列表中的众多条件之一。真正的函数有很多elseif,如果我把一个条件放在另一个里面,代码会很乱......第一次改变:我已经把> 0 ... =D第二次改变:不明白条件@ 987654331@。为什么你把括号这样?谢谢!!
  • @FernandoMoreno - 如果您对优先规则的理解与编译器的不同,这只是您可能遇到的问题的一个示例。在代码块中查看我的实际建议。明确:添加括号以在可能出现混淆时强制评估 - 它永远不会受到伤害,
  • 另外,ifs 和 elseifs 的混乱通常表明您应该尝试不同的方法
  • 我仍然对 If InStr("|TEC|FIN|", "|" & VAR2 & "|")) 感到困惑:我的困惑来自一个开头“(”和两个结尾“ )"
猜你喜欢
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 2016-11-21
  • 2015-09-16
  • 2021-05-15
  • 2012-11-19
相关资源
最近更新 更多