For...Next
 
控制流程语句进行循环

语法

For iterator [ As datatype ] = startvalue To endvalue [ Step stepvalue ]
[ statement block ]
Next [ iterator ]

参数

iterator
用于从初始值迭代到结束值的变量标识符
datatype
如果指定,变量iterator 将自动声明为类型为datatype
startvalue
表示迭代器的起始值的表达式
endvalue
用于与迭代器的值进行比较的表达式
stepvalue
每次迭代后添加到迭代器的表达式

说明

这个 For...Next循环将iterator 初始化为startvalue ,然后执行statement block ,增加iterator stepvalue 直到超过endvalue .如果stepvalue 未明确指定,则设置为1.

stepvalue endvalue 的值在执行For语句后立即内部存储,因此在For循环内也不能更改。诸如<和>的比较运算符将不会生效stepvalue endvalue ,因为在循环运行时不会重新计算表达式。(用于定义它们的表达式的结果可能会更改,但这些更改不会影响For循环的执行。)请参见示例。

注意:在某些方言中,在循环结束时,保留stepvalue endvalue 的临时变量超出范围,并且在执行循环后的任何代码后,其值不能保证不变。因此,建议不要从For...Next循环(使用Goto或类似的方式)分支出来,然后在-lang fb -lang deprecated 方言中跳回到中间。

迭代器必须是内在的标量:只能使用变量和局部变量Static/ Shared不能使用其他类型,包括数组元素,UDT成员,ByRef参数或任何类型的取消引用地址。

可以使用As datatype语法定义iterator For语句的范围相同的范围。使用此语法,iterator 将在For...Next范围内创建并销毁。请参阅下面的方言差异。

如果endvalue 小于startvalue ,则必须指定否定stepvalue ,否则statement block 将不会执行,因为startvalue 比较大于endvalue .

statement block 语句导致执行statement block 中的语句,直到iterator endvalue (或少于endvalue (如果stepvalue < 0))进行比较。iterator 将在每次执行statement block 之后递增stepvalue .如果没有给出增量,iterator 将隐式递增1.

如果在statement block 内遇到ExitFor语句,则循环将被终止,并且在封闭的Next语句之后立即恢复执行。如果遇到ContinueFor语句,则会跳过statement block 的其余部分,直到该块的相应Next语句为止。如果计数器的值仍然在endvalue 给出的范围内,则计数器的值将递增,循环重新启动。

注意:对于整数数据类型,不可能循环到可以存储在变量类型中的最高可能值(或到最低可能值),因为循环只有当增量变量超过endvalue ,永远不会发生。例如,如果您尝试将变量从0迭代到255,则该变量只有在变量达到256或更多时才会中断。对于计数器使用UByte变量将不起作用,因为尽管数字0可以保存为255,但它不能持有256.请参阅Standard Data Type Limits以查找标准数据类型的上限和下限。

像所有控制流语句一样,For语句可以嵌套,也就是说,它可以在另一个For语句的语句块中使用。

For Next Step 是可以在用户定义的类型内重载的运算符。见操作符 For操作符 Next操作符 Step

例子

Print "从3到0,步长为-0.5"
For i As Single = 3 To 0 Step -0.5
    Print "我是" & i
Next i

Dim As Integer i, j, k, toTemp, stepTemp
j = 9: k = 1

For i = 0 To j Step k
    
    j = 0: k = 0 ''改变j和k对当前循环没有影响。
    Print i;
    
Next i
Print

'在内部,这是上面的例子:
j = 9: k = 1

i = 0: toTemp = j: stepTemp = k
Do While IIf(stepTemp >= 0, i <= toTemp, i >= toTemp)
    
    j = 0: k = 0 ''改变j和k对当前循环没有影响。
    Print i;
    
    i += stepTemp
Loop
Print


方言差异

  • -lang fb -lang deprecated 方言中,在对于.. 下一个块内声明的变量只能在该块内部显示,无法在该外部访问。
  • -lang qb -lang fblite 方言中,在对于.. 下一个块内声明的变量(包括计数器如果声明,以及用于保存的任何临时变量) endvalue stepvalue )具有与QB类似的程序范围范围

与QB差别

  • ByRef参数不能用作计数器。

参考