VB 案例条件为真,但未执行操作

VB Case condition is true but, action is not executed

我编写了以下 VB 代码。

Dim qu1, qu2, facroredload, bx, iterations, q3, err As Double
                
bx = 0.1
qu1 = "constant"

For iterations = 0 To 10000
    qu2 = "constant" * bx
    q3 = qu1 + qu2
    facroredload = "constant" / bx ^ 2
    err = Math.Abs(q3 - facroredload)

    Select Case err
        Case > 10
            bx += 0.1
        Case err <= 10 And err > 1
            bx = bx + 0.01
        Case err <= 1 And err > 0.1
            bx = bx + 0.001
        Case err <= 0.1 And err > 0.01
            bx = bx + 0.0001
        Case err < 0.01
            Exit For
    End Select
Next

bx 值达到 1.700000000004(我不知道为什么代码添加了太多小数点)然后它永远不会改变。 For 语句仍然令人兴奋,但是,即使 Case err <= 10 And err > 1 为真,bx 也不会超过 1.7。

VB 的 Select Case 实际上只是一个花哨的 if 语句。每个 Case 如何转换为 if 表达式取决于 case 表达式的格式。共有三个选项:

  • 范围语句,如 Case 1 to 10。这转化为 If err >= 1 And err <= 10.
  • 以比较运算符开头的语句,例如第一个 Case 开头的 >。使用此语法时,它只是在 case 表达式之前插入您的测试表达式,如 If err > 10.
  • 不是范围且不以比较运算符开头的语句,例如您的第二个 Case。这种情况的处理方式与使用比较运算符的情况完全相同,其中比较运算符隐含为 =。这意味着您的第二个 Case 被视为 If err = (err <= 10 And err > 1).

一旦你理解了这一点,你应该能够明白为什么你的第二个 Case 语句对你不起作用。如果 err 是 1.7,那么第二个 case 语句归结为 If err = True,但是 err 不是 True,它是一个介于 1 和 10 之间的数字。

要修复您的代码,您有两种选择。最简单的解决方案是:

    Select Case err
        Case > 10
            bx += 0.1
        Case > 1
            bx = bx + 0.01
        Case > 0.1
            bx = bx + 0.001
        Case > 0.01
            bx = bx + 0.0001
        Case Else
            Exit For
    End Select

如果满足多个Case,则只执行第一个满足的子句,就像If/ElseIf。这就是为什么上面的代码可以工作,即使它只指定了每个范围的下限。如果您不喜欢隐含的上限,可以这样添加:Case > 1 And err <= 10。我个人认为离开每个范围的上限实际上更清楚。