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
。我个人认为离开每个范围的上限实际上更清楚。
我编写了以下 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
。我个人认为离开每个范围的上限实际上更清楚。