我的一个学生写了这个程序,最多可以计算5个,这是我没想到的。我相信当循环开始时,x的目标值将被0覆盖,因此循环将无法启动或无限运行。有人可以告诉我幕后发生了什么吗?
Dim x As Integer
x = 5
For x = 0 To x
MsgBox(x)
Next x
答案 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的最终值
'因此初始化开始和结束,然后控制变量开始在该限制内变化。
答案 3 :(得分:0)
感谢所有评论;我想我现在有了更好的理解。阻止范围的想法'这是我多年前听到的,但完全忘记了。我在VB.NET中对此进行了一些游戏,并且在没有明确声明j的情况下写了'对于j = 1到x'我有点惊讶地发现它在VB.NET中有效,即使使用Option Explicit On也是如此。因此,在实践中存在块范围(和隐式块范围声明) - 在VB中。当我尝试在VBA中执行相同操作时,我收到错误消息'变量未定义'。必须至少在程序级别声明所有变量。我认为必须有一个额外的本地变量'编译器或解释器给了我免费的,这就在堆栈中。