VB或VBA For Next循环意外行为

时间:2014-10-11 14:25:59

标签: vb.net vba for-loop

我的一个学生写了这个程序,最多可以计算5个,这是我没想到的。我相信当循环开始时,x的目标值将被0覆盖,因此循环将无法启动或无限运行。有人可以告诉我幕后发生了什么吗?

Dim x As Integer
x = 5
For x = 0 To x
  MsgBox(x)
Next x

4 个答案:

答案 0 :(得分:2)

这是记录在案的行为,是For语句的MSDN文档中的相关短语:

  

在循环内部更改计数器的值会使您更难以读取和调试代码。 更改开始,结束或步骤的值不会影响首次输入循环时确定的迭代值。

代码生成器通过实际生成此代码来实现此目的:

Dim x As Integer = 5
Dim $temp = x
For x = 0 To $temp
  MsgBox(x)
Next

重要的行为btw,不仅仅是为了避免编码事故。这样做可以让循环展开,这是抖动所采用的基本优化策略之一。

答案 1 :(得分:1)

在执行循环之前首先导出目标值,此后不会触及目标值。 比较这个修改过的代码即使y在循环中被修改,其初始值也被用作目标:

Module Module1
Sub main()
    Dim x As Integer
    x = 5
    Dim y As Integer
    y = 10

    For x = 0 To y
        MsgBox(x)
        y = y - 1
    Next x

End Sub
End Module

答案 2 :(得分:0)

希望这会有所帮助:

'计数器,即循环控制变量x<>结束即计数器x的最终值

'因此初始化开始和结束,然后控制变量开始在该限制内变化。

enter image description here

enter image description here

答案 3 :(得分:0)

感谢所有评论;我想我现在有了更好的理解。阻止范围的想法'这是我多年前听到的,但完全忘记了。我在VB.NET中对此进行了一些游戏,并且在没有明确声明j的情况下写了'对于j = 1到x'我有点惊讶地发现它在VB.NET中有效,即使使用Option Explicit On也是如此。因此,在实践中存在块范围(和隐式块范围声明) - 在VB中。当我尝试在VBA中执行相同操作时,我收到错误消息'变量未定义'。必须至少在程序级别声明所有变量。我认为必须有一个额外的本地变量'编译器或解释器给了我免费的,这就在堆栈中。