For...Next – příkaz (Visual Basic)
Zopakuje skupinu příkazů s určeným počtem opakování.
Syntaxe
For counter [ As datatype ] = start To end [ Step step ]
[ statements ]
[ Continue For ]
[ statements ]
[ Exit For ]
[ statements ]
Next [ counter ]
Součástky
Část | Popis |
---|---|
counter |
Požadováno For v příkazu. Číselná proměnná Řídicí proměnná smyčky. Další informace naleznete v části Argument čítače dále v tomto tématu. |
datatype |
Nepovinné. Datový typ counter . Další informace naleznete v části Argument čítače dále v tomto tématu. |
start |
Povinný: Číselný výraz. Počáteční hodnota counter . |
end |
Povinný: Číselný výraz. Konečná hodnota counter . |
step |
Nepovinné. Číselný výraz. Množství, o které counter se při každém procházení smyčky zvýší. |
statements |
Nepovinné. Jeden nebo více příkazů mezi For zadaným Next počtem spuštění. |
Continue For |
Nepovinné. Přenese řízení do další iterace smyčky. |
Exit For |
Nepovinné. Přenese kontrolu mimo smyčku For . |
Next |
Povinný: Ukončí definici smyčky For . |
Poznámka:
Klíčové To
slovo se v tomto příkazu používá k určení rozsahu pro čítač. Toto klíčové slovo můžete použít také ve výběru... Case – příkaz a v deklaracích polí Další informace o deklaracích polí naleznete v tématu Dim – příkaz.
Jednoduché příklady
Strukturu ...Next
použijeteFor
, když chcete opakovat sadu příkazů nastavený početkrát.
V následujícím příkladu index
začíná proměnná hodnotou 1 a zvýší se o každou iteraci smyčky, která končí po dosažení index
hodnoty 5.
For index As Integer = 1 To 5
Debug.Write(index.ToString & " ")
Next
Debug.WriteLine("")
' Output: 1 2 3 4 5
V následujícím příkladu number
začíná proměnná na 2 a je snížena o 0,25 pro každou iteraci smyčky, končící po dosažení hodnoty number
0. Argument Step
-.25
zmenšuje hodnotu o 0,25 pro každou iteraci smyčky.
For number As Double = 2 To 0 Step -0.25
Debug.Write(number.ToString & " ")
Next
Debug.WriteLine("")
' Output: 2 1.75 1.5 1.25 1 0.75 0.5 0.25 0
Tip
A While... Ukončit příkaz While nebo Do... Příkaz smyčky funguje dobře, když nevíte, kolikrát se mají příkazy ve smyčce spouštět. Pokud ale očekáváte, že smyčku spustíte určitou dobu, je lepší volbou smyčka For
...Next
. Počet iterací určíte při prvním zadání smyčky.
Vnoření smyček
Smyčky můžete vnořit For
vložením jedné smyčky do jiné. Následující příklad ukazuje vnořené For
...Next
struktury, které mají různé hodnoty kroku. Vnější smyčka vytvoří řetězec pro každou iteraci smyčky. Vnitřní smyčka dekrementuje proměnnou čítače smyčky pro každou iteraci smyčky.
For indexA = 1 To 3
' Create a new StringBuilder, which is used
' to efficiently build strings.
Dim sb As New System.Text.StringBuilder()
' Append to the StringBuilder every third number
' from 20 to 1 descending.
For indexB = 20 To 1 Step -3
sb.Append(indexB.ToString)
sb.Append(" ")
Next indexB
' Display the line.
Debug.WriteLine(sb.ToString)
Next indexA
' Output:
' 20 17 14 11 8 5 2
' 20 17 14 11 8 5 2
' 20 17 14 11 8 5 2
Při vnořování smyček musí mít každá smyčka jedinečnou counter
proměnnou.
Můžete také vnořit různé druhy řídicích struktur mezi sebou. Další informace naleznete v tématu Vnořené řídicí struktury.
Ukončit a pokračovat pro
Příkaz Exit For
okamžitě ukončí For
...Next
přenese řízení na příkaz, který následuje za příkazem Next
.
Příkaz Continue For
okamžitě přenese řízení na další iteraci smyčky. Další informace naleznete v tématu Continue – příkaz.
Následující příklad znázorňuje použití Continue For
příkazů a Exit For
příkazů.
For index As Integer = 1 To 100000
' If index is between 5 and 7, continue
' with the next iteration.
If index >= 5 AndAlso index <= 8 Then
Continue For
End If
' Display the index.
Debug.Write(index.ToString & " ")
' If index is 10, exit the loop.
If index = 10 Then
Exit For
End If
Next
Debug.WriteLine("")
' Output: 1 2 3 4 9 10
Můžete vložit libovolný počet Exit For
příkazů do For
...Next
Smyčky. Při použití vnořené For
...Next
smyčky, Exit For
ukončí nejvnitřnější smyčku a přenese řízení na další vyšší úroveň vnoření.
Exit For
se často používá po vyhodnocení určité podmínky (například v If
...Then
...Else
struktury). Možná budete chtít použít Exit For
následující podmínky:
Pokračování v iteraci je zbytečné nebo nemožné. Tuto podmínku může vytvořit chybná hodnota nebo žádost o ukončení.
A
Try
...Catch
...Finally
příkaz zachytí výjimku. Můžete použítExit For
na konciFinally
bloku.Máte nekonečnou smyčku, což je smyčka, která by mohla spustit velký nebo dokonce nekonečný početkrát. Pokud takovou podmínku zjistíte, můžete ji použít
Exit For
k úniku smyčky. Další informace naleznete v tématu Do... Příkaz Loop.
Technická implementace
For
Při spuštění smyčky start
...Next
jazyka Visual Basic vyhodnotí , end
a step
. Jazyk Visual Basic vyhodnocuje tyto hodnoty pouze v tuto chvíli a pak přiřadí start
.counter
Před spuštěním bloku příkazu se Visual Basic porovná counter
s end
. Pokud counter
je již větší než end
hodnota (nebo menší, pokud step
je záporná), smyčka For
skončí a ovládací prvek předá do příkazu, který následuje za příkazem Next
. Jinak se blok příkazu spustí.
Pokaždé, když Visual Basic narazí na Next
příkaz, zvýší counter
step
a vrátí se do For
příkazu. Znovu porovná counter
end
s a znovu spustí blok nebo ukončí smyčku v závislosti na výsledku. Tento proces pokračuje, dokud counter
neprojde end
nebo Exit For
se nezjistila příkaz.
Smyčka se nezastaví, dokud counter
nepřejde end
. Pokud counter
je rovno end
, smyčka pokračuje. Porovnání, které určuje, zda se má blok spustit, je counter
<= end
pokud step
je kladné a counter
>= end
pokud step
je záporné.
Pokud změníte hodnotu counter
uvnitř smyčky, může být čtení a ladění kódu obtížnější. Změna hodnoty parametru start
, end
nebo step
nemá vliv na hodnoty iterace, které byly určeny při prvním zadání smyčky.
Pokud vnořujete smyčky, kompilátor signalizuje chybu, pokud narazí na Next
příkaz vnější úrovně vnoření před Next
příkazem vnitřní úrovně. Kompilátor však může tuto překrývající se chybu rozpoznat pouze v případě, že zadáte counter
v každém Next
příkazu.
Argument kroku
Hodnota step
může být buď kladná, nebo záporná. Tento parametr určuje zpracování smyčky podle následující tabulky:
Hodnota kroku | Smyčka se spustí, pokud |
---|---|
Kladné nebo nulové | counter <= end |
Záporný | counter >= end |
Výchozí hodnota step
je 1.
Argument čítače
Následující tabulka označuje, zda counter
definuje novou místní proměnnou, která je vymezena na celou For…Next
smyčku. Toto určení závisí na tom, zda datatype
je přítomna a zda counter
je již definována.
Je datatype k dispozici? |
Je counter už definováno? |
Výsledek (jestli counter definuje novou místní proměnnou, která je vymezená na celou For...Next smyčku) |
---|---|---|
No | Ano | Ne, protože counter je již definován. Pokud rozsah counter není místní pro proceduru, dojde k upozornění v době kompilace. |
No | Ne | Ano. Datový typ je odvozen z výrazu start , end a step výrazy. Informace o odvození typu naleznete v tématu Příkaz odvození možnosti a odvození místního typu. |
Ano | Yes | Ano, ale pouze pokud je existující counter proměnná definována mimo proceduru. Tato proměnná zůstává oddělená. Pokud je obor existující counter proměnné místní pro proceduru, dojde k chybě v době kompilace. |
Yes | No | Ano. |
Datový typ counter
určuje typ iterace, který musí být jedním z následujících typů:
A
Byte
,SByte
, ,UShort
,Short
,UInteger
,ULong
Integer
Decimal
Long
,Single
nebo .Double
Výčet, který deklarujete pomocí výčtového příkazu.
A
Object
.Typ
T
, který má následující operátory, kdeB
je typ, který lze použít ve výrazuBoolean
.Public Shared Operator >= (op1 As T, op2 As T) As B
Public Shared Operator <= (op1 As T, op2 As T) As B
Public Shared Operator - (op1 As T, op2 As T) As T
Public Shared Operator + (op1 As T, op2 As T) As T
Volitelně můžete zadat proměnnou counter
v Next
příkazu. Tato syntaxe zlepšuje čitelnost programu, zejména pokud máte vnořené For
smyčky. Je nutné zadat proměnnou, která se zobrazí v odpovídajícím For
příkazu.
Výrazy start
, end
a step
výrazy mohou vyhodnotit na libovolný datový typ, který se rozšiřuje na typ counter
. Pokud používáte uživatelem definovaný typ counter
pro , možná budete muset definovat operátor převodu CType
pro převod typů start
, end
nebo step
na typ counter
.
Příklad 1
Následující příklad odebere všechny prvky z obecného seznamu. Místo pro každou... Next Statement, the example shows a For
...Next
statement that iterates in descending order. Tento příklad používá tuto techniku, protože removeAt
metoda způsobí, že prvky po odebrání elementu mají nižší hodnotu indexu.
Dim lst As New List(Of Integer) From {10, 20, 30, 40}
For index As Integer = lst.Count - 1 To 0 Step -1
lst.RemoveAt(index)
Next
Debug.WriteLine(lst.Count.ToString)
' Output: 0
Příklad 2
Následující příklad iteruje prostřednictvím výčtu, který je deklarován pomocí enum Statement.
Public Enum Mammals
Buffalo
Gazelle
Mongoose
Rhinoceros
Whale
End Enum
Public Sub ListSomeMammals()
For mammal As Mammals = Mammals.Gazelle To Mammals.Rhinoceros
Debug.Write(mammal.ToString & " ")
Next
Debug.WriteLine("")
' Output: Gazelle Mongoose Rhinoceros
End Sub
Příklad 3
V následujícím příkladu parametry příkazu používají třídu, která má operátor přetížení pro +
, -
, >=
a <=
operátory.
Private Class Distance
Public Property Number() As Double
Public Sub New(ByVal number As Double)
Me.Number = number
End Sub
' Define operator overloads to support For...Next statements.
Public Shared Operator +(ByVal op1 As Distance, ByVal op2 As Distance) As Distance
Return New Distance(op1.Number + op2.Number)
End Operator
Public Shared Operator -(ByVal op1 As Distance, ByVal op2 As Distance) As Distance
Return New Distance(op1.Number - op2.Number)
End Operator
Public Shared Operator >=(ByVal op1 As Distance, ByVal op2 As Distance) As Boolean
Return (op1.Number >= op2.Number)
End Operator
Public Shared Operator <=(ByVal op1 As Distance, ByVal op2 As Distance) As Boolean
Return (op1.Number <= op2.Number)
End Operator
End Class
Public Sub ListDistances()
Dim distFrom As New Distance(10)
Dim distTo As New Distance(25)
Dim distStep As New Distance(4)
For dist As Distance = distFrom To distTo Step distStep
Debug.Write(dist.Number.ToString & " ")
Next
Debug.WriteLine("")
' Output: 10 14 18 22
End Sub