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 to startvalue, затем выполняется statement block, идет приращение iterator по stepvalue до тех пор, пока он не превышает endvalue. Если stepvalue не является явно заданным будет присвоено 1.

Значения stepvalue и endvalue хранятся внутренне сразу же после выполнения For и таким образом не могут быть изменены в цикле For. Операторы сравнения, такие как < and > не будут эффективными, как и stepvalue или endvalue потому что выражения не будут повторно проверяется во время цикла. (Результаты выражений, используемых для их определения могут быть изменены, но эти изменения не повлияют на выполнение цикла For.) Смотрите примеры.

Примечание: В некоторых диалектах, временные переменные stepvalue и endvalue выходят из области видимости в конце цикла, и их значения не гарантированно остаются неизменными, как только любой код после цикла был выполнен. По этой причине, рекомендуется никогда не прыгать из цикла For...Next (используя Goto или подобный), а затем переходить обратно в  его середину позже,  в диалектах  -lang fb или -lang deprecated.

Итератор должен быть неотъемлемым скаляром: только Static/Shared переменные и локальные переменные могут быть использованы; не может использоваться никакой другой тип, включая элементы массива, UDT элементы, ByRef параметры или любого рода разыменованный адрес.

iterator может быть определен в той же области видимости, что и For , используя синтаксис As datatype. С помощью этого синтаксиса, iterator создается и уничтожается в течение области видимости For...Next. Смотрите диалектные различия ниже.

Если endvalue меньше startvalue , то отрицательный stepvalue должен быть указан или statement block не будет выполняться правильно, начиная со startvalue сравнивается на предмет больше, чем endvalue.

For заявление вызывает выполнение операторов в statement block пока iterator больше, чем endvalue (или меньше чем endvalue если stepvalue < 0). iterator будет увеличиваться на количество stepvalue после каждого выполнения statement block. Если не задано приращение, iterator будет неявно увеличивается на 1.

Если заявление Exit For встречается внутри statement block, цикл завершается, и выполнение возобновляется сразу же после его заявления Next. Если заявление Continue For встречается, остальные части statement block пропускаются до тех пор, пока соответствующий Next в блоке не встретится. Значение счетчика увеличивается, и цикл перезагружается, если это все еще в пределах предоставленного endvalue.

Примечание: для типов данных Integer,  не возможно, чтобы цикл дошел до максимально возможного значения (или до минимально возможного значения), которое может храниться в переменной типа, поскольку цикл нарушается только тогда, когда инкрементированнная переменная превышает endvalue. Например если вы попытаетесь сделать итерацию переменной от 0 до 255, цикл будет прерван после того, как переменная достигнет 256 или более. Использование переменной UByte для счетчика не будет работать, потому что хотя он может содержать числа от 0 до 255, он не может вместить 256. Смотрите TblVarTypes чтобы найти верхний и нижний пределы для стандартных типов данных.

Как и все операторы управления потоком, For может быть вложенным, то есть, он может использоваться в блоке оператора другого For.

For, Next, и Step - это операторы, которые могут быть перегружены внутри определяемых пользователем типов. См. Оператор For, Оператор Next, Оператор Step

Пример

Print "counting from 3 to 0, with a step of -0.5"
For i As Single = 3 To 0 Step -0.5
    Print "i is " & 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, переменные, объявленные внутри блока For..Next видны только внутри блока и не могут использоваться вне его.
  • В диалектах -lang qb и -lang fblite, переменные, объявленные внутри блока For..Next (включая счетчик, если объявлены, и любые временные переменные используемые для хранения endvalue или stepvalue), имеют расширенный процедурный scope как в QB

Отличия от QB

  • ByRef аргументы не могут использоваться как счетчики.

См. также