2025年8月22日 星期五

26.VB.NET 運算子 (Operator) 筆記 (基礎篇)

VB.NET 運算子(Operator)筆記(基礎篇)

VB.NET 運算子(Operator) 筆記(基礎篇)

Operator 是用來把資料拿去計算、比較、判斷、串連或指定的語法符號與關鍵字。只要程式需要計算費用、檢查條件、組合文字、累加數量或把結果存回變數,就會用到運算子。

運算子的重點不是記住符號表,而是理解每一類運算子會產生什麼結果。算術運算通常得到數值;比較與邏輯運算通常得到 Boolean;字串串連得到文字;賦值運算會改變變數內容。結果型別不同,後續能做的事情也不同。

先理解運算子在做什麼

運算子(Operator):對一個或多個資料執行特定動作的語法。資料本身稱為運算元,例如 10 + 5 裡的 105 是運算元,+ 是運算子。

運算子常見角色

  • 算出數值:加、減、乘、除、整除、餘數。
  • 比較資料:判斷是否相等、是否超過門檻。
  • 組合條件:多個條件同時成立,或其中一個成立。
  • 組合文字:把名稱、代碼、狀態整理成顯示文字。
  • 回存結果:把運算後的值重新指定給變數。
類型 用途 常見結果
算術運算子 處理數值計算。 數值。
比較運算子 比較兩個值的關係。 TrueFalse
邏輯運算子 組合多個 Boolean 條件。 TrueFalse
串連運算子 組合文字。 字串。
賦值運算子 把結果放回變數。 變數內容被更新。

算術運算子

運算子 用途 範例結果
+ 加法。 10 + 4 = 14
- 減法。 10 - 4 = 6
* 乘法。 10 * 4 = 40
/ 一般除法。 10 / 4 = 2.5
\ 整數除法。 10 \ 4 = 2
Mod 取得餘數。 10 Mod 4 = 2
^ 乘冪。 2 ^ 3 = 8

場景一:貼紙包裝分盒

這個範例用貼紙分盒說明 \Mod。若每盒放 12 張貼紙,完整盒數用整數除法取得,剩餘張數用餘數取得。

需要的主控項
  • TextBoxStickerCount:輸入貼紙張數。
  • ButtonPackSticker:計算分盒結果。
  • LabelPackResult:顯示結果。
範例程式碼
VB.NET / Windows Forms
Public Class Form1
    Private Sub ButtonPackSticker_Click(sender As Object, e As EventArgs) Handles ButtonPackSticker.Click
        Dim stickerCount As Integer

        If Not Integer.TryParse(TextBoxStickerCount.Text.Trim(), stickerCount) OrElse stickerCount < 0 Then
            LabelPackResult.Text = "請輸入 0 以上的貼紙張數"
            Return
        End If

        Dim perBox As Integer = 12
        Dim boxCount As Integer = stickerCount \ perBox
        Dim remainingCount As Integer = stickerCount Mod perBox
        Dim averageBox As Decimal = stickerCount / CDec(perBox)

        LabelPackResult.Text = "完整盒數:" & boxCount.ToString() & vbCrLf &
                               "剩餘張數:" & remainingCount.ToString() & vbCrLf &
                               "換算盒數:" & averageBox.ToString("N2")
    End Sub
End Class
畫面輸出結果(TextBoxStickerCount = 50)
完整盒數:4 剩餘張數:2 換算盒數:4.17
邏輯解析
  • \ 只取整數商,適合計算完整分組數量。
  • Mod 取得餘數,適合計算分組後剩下多少。
  • / 會保留小數結果,適合顯示比例或平均值。
  • 除法、整除與餘數都要避免除數為 0。

比較運算子

運算子 用途 結果
= 判斷是否相等。 Boolean。
<> 判斷是否不相等。 Boolean。
< 小於。 Boolean。
> 大於。 Boolean。
<= 小於或等於。 Boolean。
>= 大於或等於。 Boolean。

場景二:停車場剩餘格位判斷

比較運算子常用在門檻判斷。這個範例依照剩餘格位與警戒值,決定停車場狀態。

需要的主控項
  • TextBoxRemainSpace:輸入剩餘格位。
  • TextBoxAlertSpace:輸入警戒格位。
  • ButtonCheckParking:檢查狀態。
  • LabelParkingResult:顯示結果。
範例程式碼
VB.NET / Windows Forms
Public Class Form1
    Private Sub ButtonCheckParking_Click(sender As Object, e As EventArgs) Handles ButtonCheckParking.Click
        Dim remainSpace As Integer
        Dim alertSpace As Integer

        If Not Integer.TryParse(TextBoxRemainSpace.Text.Trim(), remainSpace) OrElse remainSpace < 0 Then
            LabelParkingResult.Text = "剩餘格位格式錯誤"
            Return
        End If

        If Not Integer.TryParse(TextBoxAlertSpace.Text.Trim(), alertSpace) OrElse alertSpace < 0 Then
            LabelParkingResult.Text = "警戒格位格式錯誤"
            Return
        End If

        If remainSpace = 0 Then
            LabelParkingResult.Text = "狀態:已滿位"
        ElseIf remainSpace <= alertSpace Then
            LabelParkingResult.Text = "狀態:即將滿位"
        Else
            LabelParkingResult.Text = "狀態:尚有空位"
        End If
    End Sub
End Class
畫面輸出結果(剩餘格位 = 8,警戒格位 = 10)
狀態:即將滿位
邏輯解析
  • 比較運算會得到 TrueFalse
  • remainSpace = 0 判斷是否滿位。
  • remainSpace <= alertSpace 判斷是否低於警戒門檻。
  • 比較前先驗證輸入,可避免文字資料進入數值判斷。

邏輯運算子

運算子 意思 常見用途
AndAlso 兩個條件都成立才成立。 資格檢查、輸入驗證。
OrElse 其中一個條件成立即可。 多種通過條件。
Not 反轉布林結果。 不是鎖定、不是空白。
Xor 兩邊不同才成立。 只能二選一的條件。

短路判斷:AndAlsoOrElse 會在結果已經確定時停止檢查後面的條件。這可以避免不必要的運算,也能降低空值或非法狀態造成錯誤的機會。

場景三:設備借用資格檢查

這個範例用多個 Boolean 條件組合借用資格。申請必須資料完整、沒有逾期未還紀錄,而且需要押金完成或具備免押資格。

需要的主控項
  • TextBoxApplicantName:輸入申請人。
  • CheckBoxHasOverdue:是否有逾期未還紀錄。
  • CheckBoxDepositPaid:押金是否完成。
  • CheckBoxDepositFree:是否具備免押資格。
  • ButtonCheckBorrow:檢查借用資格。
  • LabelBorrowResult:顯示結果。
範例程式碼
VB.NET / Windows Forms
Public Class Form1
    Private Sub ButtonCheckBorrow_Click(sender As Object, e As EventArgs) Handles ButtonCheckBorrow.Click
        Dim hasName As Boolean = Not String.IsNullOrWhiteSpace(TextBoxApplicantName.Text)
        Dim hasOverdue As Boolean = CheckBoxHasOverdue.Checked
        Dim depositPaid As Boolean = CheckBoxDepositPaid.Checked
        Dim depositFree As Boolean = CheckBoxDepositFree.Checked

        Dim basicValid As Boolean = hasName AndAlso Not hasOverdue
        Dim depositValid As Boolean = depositPaid OrElse depositFree
        Dim canBorrow As Boolean = basicValid AndAlso depositValid

        If canBorrow Then
            LabelBorrowResult.Text = "借用資格:通過"
        Else
            LabelBorrowResult.Text = "借用資格:未通過"
        End If
    End Sub
End Class
畫面輸出結果(有姓名、無逾期、押金完成)
借用資格:通過
邏輯解析
  • Not hasOverdue 表示沒有逾期未還紀錄。
  • depositPaid OrElse depositFree 表示押金完成或免押資格成立。
  • 把複雜條件拆成有名稱的 Boolean 變數,會比全部塞進同一個 If 更清楚。

場景四:通知方式只能二選一

Xor 適合檢查兩個條件是否只成立其中一個。這個範例要求簡訊與 Email 只能選一種。

需要的主控項
  • CheckBoxSmsNotice:簡訊通知。
  • CheckBoxEmailNotice:Email 通知。
  • ButtonCheckNotice:檢查通知方式。
  • LabelNoticeResult:顯示結果。
範例程式碼
VB.NET / Windows Forms
Public Class Form1
    Private Sub ButtonCheckNotice_Click(sender As Object, e As EventArgs) Handles ButtonCheckNotice.Click
        Dim useSms As Boolean = CheckBoxSmsNotice.Checked
        Dim useEmail As Boolean = CheckBoxEmailNotice.Checked
        Dim onlyOneMethod As Boolean = useSms Xor useEmail

        If onlyOneMethod Then
            LabelNoticeResult.Text = "通知方式:設定完成"
        Else
            LabelNoticeResult.Text = "通知方式:請只選擇一種"
        End If
    End Sub
End Class
畫面輸出結果(只勾選 Email)
通知方式:設定完成
邏輯解析
  • Xor 在兩邊不同時回傳 True
  • 兩個都勾選或兩個都不勾選,結果都會是 False
  • 若選項不只兩個,通常應改用計數方式檢查選了幾個。

字串串連運算子

&VB.NET 最常用的字串串連運算子。文字組合時優先使用 &,可避免和數值加法 + 混淆。

場景五:產生取件通知文字

這個範例把姓名、取件碼與櫃台名稱串成一段通知文字。多行顯示可搭配 vbCrLf

需要的主控項
  • TextBoxReceiverName:輸入收件人。
  • TextBoxPickupCode:輸入取件碼。
  • ComboBoxCounter:選擇櫃台。
  • ButtonBuildMessage:產生通知文字。
  • LabelMessage:顯示通知文字。
範例程式碼
VB.NET / Windows Forms
Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ComboBoxCounter.Items.Clear()
        ComboBoxCounter.Items.Add("一號櫃台")
        ComboBoxCounter.Items.Add("二號櫃台")
        ComboBoxCounter.SelectedIndex = 0
    End Sub

    Private Sub ButtonBuildMessage_Click(sender As Object, e As EventArgs) Handles ButtonBuildMessage.Click
        Dim receiverName As String = TextBoxReceiverName.Text.Trim()
        Dim pickupCode As String = TextBoxPickupCode.Text.Trim().ToUpper()
        Dim counterName As String = ComboBoxCounter.SelectedItem.ToString()

        If receiverName = String.Empty OrElse pickupCode = String.Empty Then
            LabelMessage.Text = "請輸入收件人與取件碼"
            Return
        End If

        LabelMessage.Text = "收件人:" & receiverName & vbCrLf &
                            "取件碼:" & pickupCode & vbCrLf &
                            "取件位置:" & counterName
    End Sub
End Class
畫面輸出結果
收件人:林小姐 取件碼:P482913 取件位置:一號櫃台
邏輯解析
  • & 明確表示字串串連。
  • vbCrLf 用來建立換行顯示。
  • 文字組合前先整理輸入,可讓顯示結果更穩定。

賦值與複合賦值運算子

運算子 等同概念 用途
= x = 5 基本指定。
+= x = x + 5 加法後回存。
-= x = x - 5 減法後回存。
*= x = x * 5 乘法後回存。
&= s = s & "A" 文字追加。

場景六:飲料補貨紀錄

這個範例使用 += 累加庫存,使用 &= 追加紀錄文字。複合賦值適合表達「在原本資料上增加或追加」。

需要的主控項
  • TextBoxAddBottle:輸入補貨瓶數。
  • ButtonAddStock:加入庫存。
  • ButtonResetStock:重置庫存。
  • TextBoxStockLog:顯示紀錄,建議設定 Multiline=True
  • LabelStock:顯示目前庫存。
範例程式碼
VB.NET / Windows Forms
Public Class Form1
    Private bottleStock As Integer = 0

    Private Sub ButtonAddStock_Click(sender As Object, e As EventArgs) Handles ButtonAddStock.Click
        Dim addCount As Integer

        If Not Integer.TryParse(TextBoxAddBottle.Text.Trim(), addCount) OrElse addCount <= 0 Then
            LabelStock.Text = "請輸入大於 0 的補貨瓶數"
            Return
        End If

        bottleStock += addCount
        TextBoxStockLog.Text &= "補貨:" & addCount.ToString() & " 瓶" & vbCrLf
        LabelStock.Text = "目前庫存:" & bottleStock.ToString() & " 瓶"
    End Sub

    Private Sub ButtonResetStock_Click(sender As Object, e As EventArgs) Handles ButtonResetStock.Click
        bottleStock = 0
        TextBoxStockLog.Text = String.Empty
        LabelStock.Text = "目前庫存:0 瓶"
    End Sub
End Class
畫面輸出結果(輸入 24 後補貨)
目前庫存:24 瓶 補貨:24 瓶
邏輯解析
  • bottleStock += addCount 表示在原本庫存上加上補貨數量。
  • TextBoxStockLog.Text &= ... 表示把新紀錄追加到原本文字後面。
  • 累加前先檢查輸入,可避免庫存被非法數值影響。

運算子優先順序

優先順序:同一個運算式中若有多個運算子,VB.NET 會依固定順序計算。括號可以改變計算順序,也能讓公式意圖更容易閱讀。

優先程度 類型 例子
最高 括號。 ( )
較高 乘冪。 ^
中間 乘法、除法、整除、餘數。 * / \ Mod
較低 加法、減法、字串串連。 + - &
更低 比較與邏輯。 = > < AndAlso OrElse

場景七:套票價格公式

這個範例比較有括號與無括號的差異。相同數字只要順序不同,結果就可能完全不同。

需要的主控項
  • ButtonCompareFormula:比較公式。
  • LabelFormulaA:顯示無括號結果。
  • LabelFormulaB:顯示有括號結果。
範例程式碼
VB.NET / Windows Forms
Public Class Form1
    Private Sub ButtonCompareFormula_Click(sender As Object, e As EventArgs) Handles ButtonCompareFormula.Click
        Dim noBracketAmount As Integer = 120 + 30 * 3
        Dim bracketAmount As Integer = (120 + 30) * 3

        LabelFormulaA.Text = "無括號:120 + 30 * 3 = " & noBracketAmount.ToString()
        LabelFormulaB.Text = "有括號:(120 + 30) * 3 = " & bracketAmount.ToString()
    End Sub
End Class
畫面輸出結果
無括號:120 + 30 * 3 = 210 有括號:(120 + 30) * 3 = 450
邏輯解析
  • 沒有括號時,乘法會先於加法執行。
  • 有括號時,括號內的 120 + 30 會先算。
  • 實務公式只要稍微複雜,就建議用括號明確表示計算順序。

綜合應用:活動報名費試算

場景八:親子活動報名費分析

這個範例整合算術、比較、邏輯、串連與賦值。輸入單價、人數與折扣率後,計算小計、折扣、總額,並判斷訂單是否有效與是否達到贈品門檻。

需要的主控項
  • TextBoxUnitFee:輸入單人費用。
  • TextBoxPeople:輸入報名人數。
  • TextBoxDiscountRate:輸入折扣率,例如 0.1
  • CheckBoxEarlyBird:是否早鳥報名。
  • ButtonAnalyzeSignup:試算報名費。
  • LabelSignupReport:顯示結果。
範例程式碼
VB.NET / Windows Forms
Public Class Form1
    Private Sub ButtonAnalyzeSignup_Click(sender As Object, e As EventArgs) Handles ButtonAnalyzeSignup.Click
        Dim unitFee As Decimal
        Dim peopleCount As Integer
        Dim discountRate As Decimal

        If Not Decimal.TryParse(TextBoxUnitFee.Text.Trim(), unitFee) OrElse unitFee <= 0D Then
            LabelSignupReport.Text = "單人費用格式錯誤"
            Return
        End If

        If Not Integer.TryParse(TextBoxPeople.Text.Trim(), peopleCount) OrElse peopleCount <= 0 Then
            LabelSignupReport.Text = "報名人數格式錯誤"
            Return
        End If

        If Not Decimal.TryParse(TextBoxDiscountRate.Text.Trim(), discountRate) OrElse discountRate < 0D Then
            LabelSignupReport.Text = "折扣率格式錯誤"
            Return
        End If

        Dim earlyBird As Boolean = CheckBoxEarlyBird.Checked
        Dim subTotal As Decimal = unitFee * peopleCount
        Dim discountAmount As Decimal = subTotal * discountRate
        Dim totalAmount As Decimal = subTotal - discountAmount

        If earlyBird Then
            totalAmount -= 80D
        End If

        If totalAmount < 0D Then
            totalAmount = 0D
        End If

        Dim validSignup As Boolean = peopleCount > 0 AndAlso unitFee > 0D
        Dim giftQualified As Boolean = totalAmount >= 1000D OrElse peopleCount >= 5

        LabelSignupReport.Text = "小計:" & subTotal.ToString("N0") & " 元" & vbCrLf &
                                 "折扣:" & discountAmount.ToString("N0") & " 元" & vbCrLf &
                                 "總額:" & totalAmount.ToString("N0") & " 元" & vbCrLf &
                                 "報名狀態:" & If(validSignup, "有效", "無效") & vbCrLf &
                                 "贈品資格:" & If(giftQualified, "符合", "未符合")
    End Sub
End Class
畫面輸出結果(單價 300、人數 4、折扣 0.1,早鳥)
小計:1,200 元 折扣:120 元 總額:1,000 元 報名狀態:有效 贈品資格:符合
整合重點
  • *--= 用於金額計算。
  • <=<>= 用於格式與門檻判斷。
  • AndAlsoOrElse 用於條件組合。
  • &vbCrLf 用於組合多行輸出文字。

實務判斷與常見誤區

常見問題整理

  • 混淆 /\/ 是一般除法,\ 是整數除法。
  • 除數沒有檢查 0:除法、整除與 Mod 都要先檢查除數。
  • 文字串連使用 +文字組合優先使用 &,避免與數值加法混淆。
  • 條件全部寫在同一行:複雜條件可拆成有名稱的 Boolean 變數。
  • 忽略運算子優先順序:公式稍微複雜就加括號。
  • 使用 And / Or 取代 AndAlso / OrElse一般條件判斷通常優先使用短路版本。
需求 建議運算子 原因
計算完整分組 \Mod 可分別取得完整組數與剩餘數量。
判斷門檻 ><>=<= 比較結果可直接交給 If
組合多個條件 AndAlsoOrElse 具備短路判斷,較適合一般條件流程。
組合顯示文字 & 語意明確,不容易和加法混淆。
在原值上累加 +=-=&= 適合表達回存更新。

重點整理

  1. 運算子用來執行計算、比較、邏輯判斷、文字串連與結果指定。
  2. 算術運算子通常產生數值結果。
  3. 比較運算子與邏輯運算子通常產生 Boolean 結果。
  4. / 是一般除法,\ 是整數除法,Mod 是餘數。
  5. 除法、整除與餘數都需要檢查除數不可為 0。
  6. 字串串連建議使用 &,不要依賴 + 混合處理。
  7. AndAlsoOrElse 具備短路判斷,適合一般條件組合。
  8. 公式只要有多個運算子,就應善用括號讓計算順序更清楚。