跳轉到內容

Visual Basic/分支

來自華夏公益教科書,開放的書籍,為開放的世界

分支是程式必須做出選擇的點。使用這些資料結構,現在可以編寫具有多種結果的程式。你可能熟悉第一種型別來自 代數,一個 If-Then 語句,或者 If P then Q。它們的工作方式幾乎相同。另一種型別是 Select Case,這在某些情況下可能更容易。

這個概念的另一個名稱是 條件子句。條件子句是在特定表示式(條件)為真時才執行的程式碼塊。

If...Then 語句

[編輯 | 編輯原始碼]

If...Then 語句是所有程式設計中最基本的語句之一。每種語言都有它們,或多或少。在 Visual Basic 中,If...Then 語句的語法如下

  If (condition) Then
      (reaction)
  End If
  • condition - 程式執行的一組測試。
  • reaction - 程式在條件返回真時遵循的指令。如果條件透過測試,則返回真,如果條件未透過測試,則返回假。

條件可以是任何東西,從

  If X = 1 Then
      MsgBox "X = 1"
  End If

  If InStr(1, sName, " ") > 0 Then
      sName = """" & sName & """"
  End If

如果條件只有一個反應,則該語句也可以在沒有 End If 的情況下表示

If Y + 3 = 7 Then MsgBox "Y + 3 DOES = 7"

這些語句還有其他部分使它們更復雜。可以使用另外兩個術語是 Else 和 ElseIf。

Else 將在條件為假的情況下,執行 Else 語句和 End If 語句之間的任何內容。

ElseIf 將在直接在其前面的條件為假的情況下,檢查另一個條件並從那裡開始。

If..Then..Else 語句

[編輯 | 編輯原始碼]

If..Then..Else 語句是最簡單的條件語句。它們也稱為分支,因為當程式在執行過程中到達“If”語句時,控制將“分支”到兩個或多個“方向”之一。If-Else 語句通常採用以下形式

  If condition Then
      statement
  Else
      other statement
  End If

如果滿足原始條件,則執行第一個語句中的所有程式碼。可選的 Else 部分指定了在條件為假時將執行的備用語句。If-Else 語句可以擴充套件到以下形式

  If condition Then
      statement
  ElseIf condition Then
      other statement
  ElseIf condition Then
      other statement
      ...
  Else
      another statement
  End If

整個塊中只執行一個語句。該語句將是第一個條件為真的語句。If-Else-If 結構的概念藉助示例更容易理解

  Dim Temperature As Double
  ...
  If Temperature >= 40.0 Then
      Debug.Print "It's extremely hot"
  ElseIf 30.0 <= Temperature And Temperature<=39.0 Then
      Debug.Print "It's hot"
  ElseIf 20.0 <= Temperature And Temperature <= 29.0 Then
      Debug.Print "It's warm"
  ElseIf 10.0 <= Temperature And temperature <= 19.0 Then
      Debug.Print "It's cool"
  ElseIf 0.0 <= Temperature And Temperature <= 9.0 Then
      Debug.Print "It's cold"
  Else
      Debug.Print "It's freezing"
  End If

最佳化提示

[編輯 | 編輯原始碼]

當此程式執行時,計算機將按順序檢查所有條件,直到其中一個條件與其對真的概念匹配。一旦發生這種情況,程式將執行緊隨條件之後的語句並繼續執行,而不會檢查其他條件是否為真。因此,當你嘗試最佳化程式時,最好按降序可能性對 If..Then..Else 條件進行排序。這將確保在最常見的情況下,計算機只需要執行更少的工作,因為它很可能只需要檢查一兩個 分支 才能找到它應該執行的語句。但是,在第一次編寫程式時,儘量不要考慮太多,以免發現自己過早地進行最佳化。

在 Visual Basic Classic 中,具有多個條件的條件語句不使用短路求值。為了模擬 C/C++ 的短路求值,請使用上面的示例中所述的 ElseIf。事實上,對於複雜的表示式,顯式的 If..Then..ElseIf 語句比等效的短路表示式更清晰易讀。

Select Case

[編輯 | 編輯原始碼]

通常需要將一個特定變數與多個常量表達式進行比較。對於這種條件表示式,使用 Select Case。上面的示例就是一個例子,也可以這樣寫

  Select Case Temperature
      Case Is >= 40#
          Debug.Print "It's extremely hot"
      Case 30# To 39#
          Debug.Print "It's hot"
      Case 20# To 29#
          Debug.Print "It's warm"
      Case 10# To 19#
          Debug.Print "It's cool"
      Case 0# To 9#
          Debug.Print "It's cold"
      Case Else
          Debug.Print "It's freezing"
  End Select

無條件語句

[編輯 | 編輯原始碼]

無條件語句允許你在沒有條件的情況下更改程式流程。在使用無條件語句時應謹慎。它們通常會使程式難以理解。閱讀下面的 Goto 不邪惡嗎? 以獲取更多資訊。

結束函式、子程式或屬性,並返回到呼叫過程或函式。請注意,在 Visual Basic 中,從函式返回並分配返回值需要兩個單獨的語句。

對於過程

Exit Sub

對於函式

Exit function

對於屬性

Exit Property

這個簡單的命令結束程式的執行

例如

  Private Sub cmd1_Click()
      End
  End Sub

在這個例子中,當點選按鈕 cmd1 時,程式將終止。End 命令是為了向後相容而提供的,很少(如果有的話)需要用來結束 VB 程式。結束 VB 程式的正確方法是釋放所有物件引用,停止任何執行的計時器,並退出任何正在執行的過程。在一個小的程式中,這可能意味著簡單地解除安裝所有窗體。當沒有活動的物件引用且沒有程式碼執行時,VB 將以優雅的方式終止程式。使用 End 結束程式將以不優雅的方式終止程式(某些內容可能無法正常關閉)。

將控制轉移到標籤(或行號)之後的語句。

      Goto Label
      Dont_Do_Something
  Label:
      ...

在 Visual Basic 中,Goto 語句的目標必須在同一個過程中;這透過使其不可能跳入另一個子程式的中間來防止對該功能的濫用。

Goto 不邪惡嗎?

[編輯 | 編輯原始碼]

人們常說 Goto 是邪惡的,應該避免使用 goto。但往往被忽視的是,任何不是過程或函式中最後一個語句的退出語句也是無條件語句 - 偽裝的 goto。

因此,如果你有包含多個退出語句的函式和過程,你也可以使用 goto。當涉及到可讀性時,以下兩個示例幾乎相同

  Sub Use_Exit
      Do_Something
      If Test Then
          Exit Sub
      End If
      Do_Something_Else
  End Sub

  Sub Use_Goto is
      Do_Something
      If Test Then
          Goto Exit_Use_Goto
      End If
      Do_Something_Else
  Exit_Use_Goto:
  End Sub

在純結構化方法中,既不需要 goto 也不需要多個退出語句

  Sub Use_If is
      Do_Something
      If Not Test Then
          Do_Something_Else
      End If
  End Sub

一些注意事項

  • Return 是一個保留字,只能與匹配的 Gosub 一起使用,並且 Gosub 必須駐留在同一個函式、子程式或屬性中。它不能用於從函式、子程式或屬性中返回 - 也許它應該讀作 Exit Sub。
  • Visual Basic 中的錯誤處理不需要使用 Goto,但需要使用不同的語法。
  • 信不信由你,Visual Basic 支援行號,例如 Goto 20 是完全可以接受的,如果存在第 20 行!
  • 如上所示使用 Exit 代替 Goto 會產生一些副作用。呼叫 Exit Sub 會清除當前錯誤狀態,即相當於 Err.Clear。

與 VB.Net 的相容性

[編輯 | 編輯原始碼]

如果您擔心可能需要將程式碼移植到 VB.Net 而無需在以後重新轉換,則可能應該完全避免使用 *goto*。

一種替代方法是偽迴圈。它的目的是偽造一個出現在例程中後面的 *goto* 目標。

  Sub Use_PseudoLoop
    
      Do 'Start the pseudo loop.  Exists only so that you can use Exit Do
          Try_Something
          If Test Then 
              Exit Do
          End If
          Try_Again
          If Test Then 
              Exit Do
          End If
          Try_Try_Again
      Loop While False ' will never loop
      Do_One_Last_Thing
  
  End Sub

當然,這個例子可以使用 *If..Then..Else..End If* 重新轉換,而根本不需要任何 Exit 語句,所以它有點人為。

  Sub Use_IfThen
  
      Try_Something
      If Not Test Then 
          Try_Again
          If Not Test Then 
              Try_Try_Again
          End If
      End If
      Do_One_Last_Thing
  
  End Sub


前一個:簡單算術 目錄 下一個:迴圈
華夏公益教科書