ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 控制流 > 原文: [https://zetcode.com/lang/visualbasic/flowcontrol/](https://zetcode.com/lang/visualbasic/flowcontrol/) 在 Visual Basic 教程的这一部分中,我们将讨论流控制。 我们将定义几个关键字,使我们能够控制 Visual Basic 程序的流程。 在 Visual Basic 语言中,有几个关键字可用于更改程序的流程。 当程序运行时,语句从源文件的顶部到底部执行。 逐一。 可以通过特定的关键字更改此流程。 语句可以执行多次。 一些语句称为条件语句。 仅在满足特定条件时才执行它们。 ## `If`语句 `If`语句具有以下一般形式: ```vb If (expression) statement End If ``` `If`关键字用于检查表达式是否为真。 如果为`true`,则执行一条语句。 该语句可以是单个语句或复合语句。 复合语句由`If/End If`块包围的多个语句组成。 ```vb Option Strict On Module Example Dim num As Byte = 31 Sub Main() If (num > 0) Console.WriteLine("num variable is positive") End If End Sub End Module ``` 我们有一个`num`变量。 它被分配为 31。`If`关键字检查布尔表达式。 表达式放在方括号之间。 `31 > 0`为`true`,因此将执行块内的语句。 ```vb $ ./ifstatement.exe num variable is positive ``` 满足条件,并将消息写入控制台。 ```vb Option Strict On Module Example Dim num As Byte = 31 Sub Main() If (num > 0) Console.WriteLine("num variable is positive") Console.WriteLine("num variable equals {0}", num) End If End Sub End Module ``` 可以在由`If`和`End If`关键字创建的块内执行更多语句。 我们可以使用`Else`关键字来创建一个简单的分支。 如果`If`关键字后方括号内的表达式的值为假,则将自动执行`Else`关键字后方的语句。 ```vb Option Strict On Module Example Dim sex As String Sub Main() sex = "female" If (sex = "male") Console.WriteLine("It is a boy") Else Console.WriteLine("It is a girl") End If End Sub End Module ``` 我们有性别变量。 它具有`"female"`字符串。 布尔表达式的计算结果为`false`,我们在控制台中得到`"It is a girl"`。 ```vb $ ./branch.exe It is a girl ``` 我们可以使用`Else If`关键字创建多个分支。 仅当不满足先前条件时,`Else If`关键字才会测试其他条件。 请注意,我们可以在测试中使用多个`Else If`关键字。 ```vb Option Strict On Module Example Dim a As Byte = 0 Sub Main() If (a < 0) Console.WriteLine("a is negative") Else If (a = 0) Console.WriteLine("a equals to zero") Else Console.WriteLine("a is a positive number") End If End Sub End Module ``` 我们有一个数值变量,并测试它是否为负数或正数或等于零。 第一个表达式的计算结果为`false`。 满足第二个条件。 程序在控制台上输出`a equals to zero`。 分支的其余部分将被跳过。 ## `Select`语句 `Select`语句是选择控制流语句。 它允许变量或表达式的值通过多路分支控制程序执行的流程。 与使用`If`和`Else If`语句的组合相比,它以更简单的方式创建多个分支。 我们有一个变量或一个表达式。 `Select`关键字用于根据值列表测试变量或表达式中的值。 值列表用`Case`关键字显示。 如果值匹配,则执行`Case`之后的语句。 有一个可选的`Case Else`语句。 如果找不到其他匹配项,则执行该命令。 ```vb Option Strict On Module Example Dim domain As String Sub Main() domain = Console.ReadLine() Select domain Case "us" Console.WriteLine("United States") Case "de" Console.WriteLine("Germany") Case "sk" Console.WriteLine("Slovakia") Case "hu" Console.WriteLine("Hungary") Case Else Console.WriteLine("Unknown") End Select End Sub End Module ``` 在我们的程序中,我们有一个域变量。 我们从命令行读取变量的值。 我们使用`Case`语句测试变量的值。 有几种选择。 例如,如果该值等于`"us"`,则将`"United States"`字符串打印到控制台。 ```vb $ ./selectcase.exe hu Hungary ``` 我们在控制台输入了`"hu"`字符串,程序以`"Hungary"`作为响应。 使用`Select`关键字可以验证一系列数字个案。 ```vb Option Strict On Module Example Dim age As Byte Sub Main() Try age = Console.ReadLine() Catch Console.WriteLine("Invalid value") End End Try Select age Case 0 To 21 Console.WriteLine("Junior") Case 22 To 60 Console.WriteLine("Adult") Case Else Console.WriteLine("Senior") End Select End Sub End Module ``` 前面的程序使用数值范围来标识一个人的年龄组。 ```vb Try age = Console.ReadLine() Catch Console.WriteLine("Invalid value") End End Try ``` 从控制台读取一个值。 我们只能使用数值数据。 `Try`,`Catch`和`End Try`关键字用于异常处理。 如果引发异常,则执行`Catch`关键字之后的语句。 `End`语句终止程序。 ```vb Case 0 To 21 Console.WriteLine("Junior") ``` 在这里,我们指定一个值范围。 如果用户输入的值在 0 到 21 之间(包括 0 和 21),则程序将在控制台上打印`"Junior"`。 ```vb $ ./agerange.exe 43 Adult ``` 我们输入了 43,程序以`Adult`字符串作为响应。 ## `While`语句 `While`语句是一个控制流语句,它允许根据给定的布尔条件重复执行代码。 这是`While`循环的一般形式: ```vb While (expression): statement End While ``` `While`关键字在`While`和`End While`关键字包围的块内执行语句。 每次将表达式求值为`true`时都会执行这些语句。 ```vb Option Strict On Module Example Sub Main() Dim i As Integer = 0 Dim sum As Integer = 0 While i < 10 i = i + 1 sum += i End While Console.WriteLine(sum) End Sub End Module ``` 在代码示例中,从一系列数字计算值的总和。 `While`循环包含三个部分:初始化,测试和更新。 语句的每次执行都称为循环。 ```vb Dim i As Integer = 0 ``` 我们启动`i`变量。 它用作计数器。 ```vb While i < 10 ... End While ``` `While`关键字后面的表达式是第二阶段,即测试。 执行主体中的语句,直到表达式的计算结果为`false`。 ```vb i = i + 1 ``` `While`循环的最后一个第三阶段。 正在更新。 我们增加计数器。 请注意,对`While`循环的不正确处理可能会导致循环不断。 可以至少运行一次该语句。 即使不满足条件。 为此,我们可以使用`Do`和`Loop While`关键字。 ```vb Option Strict On Module Example Sub Main() Dim count As Integer = 0 Do Console.WriteLine(count) Loop While (count <> 0) End Sub End Module ``` 首先执行迭代,然后求值真值表达式。 ## `For Next`语句 如果在启动循环之前知道周期数,则可以使用`For Next`语句。 在此构造中,我们声明一个计数器变量,该变量在每次循环重复期间都会自动增加或减少值。 ```vb Option Strict On Module Example Sub Main() For i As Integer = 0 To 9 Console.WriteLine(i) Next End Sub End Module ``` 在此示例中,我们将数字`0..9`打印到控制台。 ```vb For i As Integer = 0 To 9 Console.WriteLine(i) Next ``` 我们将计数器 i 初始化为零。 `Next`语句将计数器增加一,直到计数器等于 9。 Visual Basic 具有可选的`Step`关键字。 它控制计数器变量如何增加或减少。 ```vb Option Strict On Module Example Sub Main() For i As Integer = 9 To 0 Step -1 Console.WriteLine(i) Next End Sub End Module ``` 在上面的示例中,我们以相反的顺序打印数字 0..9。 ```vb For i As Integer = 9 To 0 Step -1 Console.WriteLine(i) Next ``` 该步骤也可以是负数。 我们将计数器初始化为 9。每次迭代,计数器都将减小步长值。 ## `For Each`语句 `For Each`构造简化了遍历数据集合的过程。 它没有明确的计数器。 `For Each`语句一个接一个地遍历数组或集合,并将当前值复制到构造中定义的变量中。 ```vb Option Strict On Module Example Sub Main() Dim planets() As String = { "Mercury", "Venus", _ "Earth", "Mars", "Jupiter", "Saturn", _ "Uranus", "Neptune" } For Each planet As String In planets Console.WriteLine(planet) Next End Sub End Module ``` 在此示例中,我们使用`For Each`语句遍历一系列行星。 ```vb For Each planet As String In planets Console.WriteLine(planet) Next ``` `For Each`语句的用法很简单。 `planets`是我们迭代通过的数组。 `planet`是一个临时变量,具有数组中的当前值。 `For Each`语句遍历所有行星并将它们打印到控制台。 ```vb $ ./planets.exe Mercury Venus Earth Mars Jupiter Saturn Uranus Neptune ``` 运行上面的 Visual Basic 程序将给出此输出。 ## `Exit`,`Continue`语句 `Exit`语句可用于终止由`While`,`For`或`Select`语句定义的块。 ```vb Option Strict On Module Example Dim val As Integer Sub Main While (True) val = CType((30 * Rnd), Integer) + 1 Console.Write(val.ToString & " ") If (val = 22) Exit While End If End While Console.Write(vbNewLine) End Sub End Module ``` 我们定义了一个无限的`While`循环。 只有一种方法可以跳出这样的循环。 我们必须使用`Exit While`语句。 我们从 1 到 30 中选择一个随机值。我们打印该值。 如果该值等于 22,则结束无穷的`while`循环。 ```vb $ ./exitstm.exe 30 12 13 20 19 4 2 9 6 9 22 ``` 我们可能会得到这样的东西。 `Continue`语句用于跳过循环的一部分,并继续循环的下一个迭代。 它可以与`Do`,`For`和`While`语句结合使用。 在下面的示例中,我们将打印一个数字列表,这些数字不能除以 2 而没有余数。 ```vb Option Strict On Module Example Dim num As Integer = 0 Sub Main() While (num < 1000) num = num + 1 If ((num Mod 2) = 0) Continue While End If Console.Write(num.ToString() + " ") End While Console.Write(vbNewLine) End Sub End Module ``` 我们使用`While`循环遍历数字`1..999`。 ```vb If ((num Mod 2) = 0) Continue While End If ``` 如果表达式`num Mod 2`返回 0,则可以将所讨论的数字除以 2。执行`Continue`语句,并跳过循环的其余部分。 在我们的例子中,循环的最后一条语句将被跳过,并且数字不会输出到控制台。 下一个迭代开始。 在 Visual Basic 教程的这一部分中,我们讨论的是控制流结构。