Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Opakuje skupinu příkazů, zatímco čítač smyčky se blíží konečné hodnotě.
Syntaxe
For counter [ As datatype ] = start To end [ Step step ]
[ statements ]
[ Continue For ]
[ statements ]
[ Exit For ]
[ statements ]
Next [ counter ]
Součástky
| Část | Popis |
|---|---|
counter |
V příkazu For je požadováno. Číselná proměnná Řídicí proměnná pro smyčku. Další informace naleznete v části Kontrargument dále v tomto tématu. |
datatype |
Volitelný. Datový typ counter. Další informace naleznete v části Kontrargument 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 |
Volitelný. Číselný výraz. Množství, o které se counter zvýší při každém průchodu smyčkou. |
statements |
Volitelný. Jeden nebo více příkazů mezi For a Next, které se provedou zadaný početkrát. |
Continue For |
Volitelný. Přenese řízení do další iterace smyčky. |
Exit For |
Volitelný. 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é v Select...Case příkaz a pro deklarace polí. Další informace o deklaracích polí naleznete v tématu Dim – příkaz.
Jednoduché příklady
Strukturu For...Next použijete, když chcete opakovat sadu příkazů určitý 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
Návod
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čitý početkrát, je lepší volbou smyčka For...Next. Počet iterací určíte při prvním vstupu do smyčky.
Vnoření smyček
Smyčky můžete vnořit For umístění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 cyklus a 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 Statement.
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čka. Při použití ve vnořeném 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 pro 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...Finallypříkaz zachytí výjimku. Můžete použítExit Forna konciFinallybloku.Máte nekonečnou smyčku, což je smyčka, která by mohla běžet velký počet nebo dokonce nekonečný početkrát. Pokud zjistíte takovou podmínku, můžete použít
Exit Fork přerušení smyčky. Další informace naleznete v tématu Do...Loop.
Technická implementace
ForKdyž se smyčka Next...start spustí, Visual Basic vyhodnotí end a step. Jazyk Visual Basic vyhodnocuje tyto hodnoty pouze nyní a pak přiřadí start k counter. Před spuštěním bloku příkazu se Visual Basic porovná counter s end. Pokud counter je již větší než hodnota end (nebo menší, pokud je step záporné), smyčka For skončí a řízení přejde na příkaz, který následuje po příkazu Next. Jinak se blok příkazu spustí.
Pokaždé, když Visual Basic narazí na Next příkaz, zvýší counter o step a vrátí se k For příkazu. Opět porovná counter a end, a podle výsledku buď spustí blok, nebo ukončí smyčku. Tento proces pokračuje, dokud counter neprojde end nebo nedojde k Exit For příkazu.
Smyčka se nezastaví, dokud counter nepřejde end. Pokud je counter 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, endnebo 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.
Protiargument
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) |
|---|---|---|
| Ne | Ano | Ne, protože counter je již definován. Pokud rozsah counter není místní pro proceduru, dojde k upozornění v době kompilace. |
| Ne | Ne | Ano. Datový typ je odvozen z výrazů start, end, a step. Informace o odvození typu naleznete v tématu Příkaz Option Infer a Místní odvozování typu. |
| Ano | Ano | 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. |
| Ano | Ne | 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,Integer,ULong,Long,Decimal,Single, neboDouble.Výčet, který deklarujete pomocí Enum Statement.
Nějaký
Object.Typ
T, který má následující operátory, kdeBje typ, který lze použít ve výrazuBoolean.Public Shared Operator >= (op1 As T, op2 As T) As BPublic Shared Operator <= (op1 As T, op2 As T) As BPublic Shared Operator - (op1 As T, op2 As T) As TPublic 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 mohou být vyhodnoceny na libovolný datový typ, který se rozšiřuje na typ counter. Pokud používáte uživatelem definovaný typ counterpro , možná budete muset definovat operátor převodu CType pro převod typů start, endnebo step na typ counter.
Příklad 1
Následující příklad odebere všechny prvky z obecného seznamu. Místo For Each...Next Statement, příklad ukazuje příkaz For...Next, který iteruje v sestupném pořadí. 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