VB.NET 運算子(Operator) 筆記(基礎篇)
Operator 是用來把資料拿去計算、比較、判斷、串連或指定的語法符號與關鍵字。只要程式需要計算費用、檢查條件、組合文字、累加數量或把結果存回變數,就會用到運算子。
運算子的重點不是記住符號表,而是理解每一類運算子會產生什麼結果。算術運算通常得到數值;比較與邏輯運算通常得到 Boolean;字串串連得到文字;賦值運算會改變變數內容。結果型別不同,後續能做的事情也不同。
先理解運算子在做什麼
運算子(Operator):對一個或多個資料執行特定動作的語法。資料本身稱為運算元,例如 10 + 5 裡的 10 與 5 是運算元,+ 是運算子。
運算子常見角色
- 算出數值:加、減、乘、除、整除、餘數。
- 比較資料:判斷是否相等、是否超過門檻。
- 組合條件:多個條件同時成立,或其中一個成立。
- 組合文字:把名稱、代碼、狀態整理成顯示文字。
- 回存結果:把運算後的值重新指定給變數。
| 類型 | 用途 | 常見結果 |
|---|---|---|
| 算術運算子 | 處理數值計算。 | 數值。 |
| 比較運算子 | 比較兩個值的關係。 | True 或 False。 |
| 邏輯運算子 | 組合多個 Boolean 條件。 | True 或 False。 |
| 串連運算子 | 組合文字。 | 字串。 |
| 賦值運算子 | 把結果放回變數。 | 變數內容被更新。 |
算術運算子
| 運算子 | 用途 | 範例結果 |
|---|---|---|
| + | 加法。 | 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:顯示結果。
範例程式碼
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
邏輯解析
\只取整數商,適合計算完整分組數量。Mod取得餘數,適合計算分組後剩下多少。/會保留小數結果,適合顯示比例或平均值。- 除法、整除與餘數都要避免除數為 0。
比較運算子
| 運算子 | 用途 | 結果 |
|---|---|---|
| = | 判斷是否相等。 | Boolean。 |
| <> | 判斷是否不相等。 | Boolean。 |
| < | 小於。 | Boolean。 |
| > | 大於。 | Boolean。 |
| <= | 小於或等於。 | Boolean。 |
| >= | 大於或等於。 | Boolean。 |
場景二:停車場剩餘格位判斷
比較運算子常用在門檻判斷。這個範例依照剩餘格位與警戒值,決定停車場狀態。
需要的主控項
TextBoxRemainSpace:輸入剩餘格位。TextBoxAlertSpace:輸入警戒格位。ButtonCheckParking:檢查狀態。LabelParkingResult:顯示結果。
範例程式碼
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
邏輯解析
- 比較運算會得到
True或False。 remainSpace = 0判斷是否滿位。remainSpace <= alertSpace判斷是否低於警戒門檻。- 比較前先驗證輸入,可避免文字資料進入數值判斷。
邏輯運算子
| 運算子 | 意思 | 常見用途 |
|---|---|---|
| AndAlso | 兩個條件都成立才成立。 | 資格檢查、輸入驗證。 |
| OrElse | 其中一個條件成立即可。 | 多種通過條件。 |
| Not | 反轉布林結果。 | 不是鎖定、不是空白。 |
| Xor | 兩邊不同才成立。 | 只能二選一的條件。 |
短路判斷:AndAlso 與 OrElse 會在結果已經確定時停止檢查後面的條件。這可以避免不必要的運算,也能降低空值或非法狀態造成錯誤的機會。
場景三:設備借用資格檢查
這個範例用多個 Boolean 條件組合借用資格。申請必須資料完整、沒有逾期未還紀錄,而且需要押金完成或具備免押資格。
需要的主控項
TextBoxApplicantName:輸入申請人。CheckBoxHasOverdue:是否有逾期未還紀錄。CheckBoxDepositPaid:押金是否完成。CheckBoxDepositFree:是否具備免押資格。ButtonCheckBorrow:檢查借用資格。LabelBorrowResult:顯示結果。
範例程式碼
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:顯示結果。
範例程式碼
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
邏輯解析
Xor在兩邊不同時回傳True。- 兩個都勾選或兩個都不勾選,結果都會是
False。 - 若選項不只兩個,通常應改用計數方式檢查選了幾個。
字串串連運算子
&:VB.NET 最常用的字串串連運算子。文字組合時優先使用 &,可避免和數值加法 + 混淆。
場景五:產生取件通知文字
這個範例把姓名、取件碼與櫃台名稱串成一段通知文字。多行顯示可搭配 vbCrLf。
需要的主控項
TextBoxReceiverName:輸入收件人。TextBoxPickupCode:輸入取件碼。ComboBoxCounter:選擇櫃台。ButtonBuildMessage:產生通知文字。LabelMessage:顯示通知文字。
範例程式碼
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
邏輯解析
&明確表示字串串連。vbCrLf用來建立換行顯示。- 文字組合前先整理輸入,可讓顯示結果更穩定。
賦值與複合賦值運算子
| 運算子 | 等同概念 | 用途 |
|---|---|---|
| = | x = 5 |
基本指定。 |
| += | x = x + 5 |
加法後回存。 |
| -= | x = x - 5 |
減法後回存。 |
| *= | x = x * 5 |
乘法後回存。 |
| &= | s = s & "A" |
文字追加。 |
場景六:飲料補貨紀錄
這個範例使用 += 累加庫存,使用 &= 追加紀錄文字。複合賦值適合表達「在原本資料上增加或追加」。
需要的主控項
TextBoxAddBottle:輸入補貨瓶數。ButtonAddStock:加入庫存。ButtonResetStock:重置庫存。TextBoxStockLog:顯示紀錄,建議設定Multiline=True。LabelStock:顯示目前庫存。
範例程式碼
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
邏輯解析
bottleStock += addCount表示在原本庫存上加上補貨數量。TextBoxStockLog.Text &= ...表示把新紀錄追加到原本文字後面。- 累加前先檢查輸入,可避免庫存被非法數值影響。
運算子優先順序
優先順序:同一個運算式中若有多個運算子,VB.NET 會依固定順序計算。括號可以改變計算順序,也能讓公式意圖更容易閱讀。
| 優先程度 | 類型 | 例子 |
|---|---|---|
| 最高 | 括號。 | ( ) |
| 較高 | 乘冪。 | ^ |
| 中間 | 乘法、除法、整除、餘數。 | * / \ Mod |
| 較低 | 加法、減法、字串串連。 | + - & |
| 更低 | 比較與邏輯。 | = > < AndAlso OrElse |
場景七:套票價格公式
這個範例比較有括號與無括號的差異。相同數字只要順序不同,結果就可能完全不同。
需要的主控項
ButtonCompareFormula:比較公式。LabelFormulaA:顯示無括號結果。LabelFormulaB:顯示有括號結果。
範例程式碼
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會先算。 - 實務公式只要稍微複雜,就建議用括號明確表示計算順序。
綜合應用:活動報名費試算
場景八:親子活動報名費分析
這個範例整合算術、比較、邏輯、串連與賦值。輸入單價、人數與折扣率後,計算小計、折扣、總額,並判斷訂單是否有效與是否達到贈品門檻。
需要的主控項
TextBoxUnitFee:輸入單人費用。TextBoxPeople:輸入報名人數。TextBoxDiscountRate:輸入折扣率,例如0.1。CheckBoxEarlyBird:是否早鳥報名。ButtonAnalyzeSignup:試算報名費。LabelSignupReport:顯示結果。
範例程式碼
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
整合重點
*、-、-=用於金額計算。<=、<、>=用於格式與門檻判斷。AndAlso與OrElse用於條件組合。&與vbCrLf用於組合多行輸出文字。
實務判斷與常見誤區
常見問題整理
- 混淆
/與\:/是一般除法,\是整數除法。 - 除數沒有檢查 0:除法、整除與
Mod都要先檢查除數。 - 文字串連使用
+:文字組合優先使用&,避免與數值加法混淆。 - 條件全部寫在同一行:複雜條件可拆成有名稱的 Boolean 變數。
- 忽略運算子優先順序:公式稍微複雜就加括號。
- 使用
And/Or取代AndAlso/OrElse:一般條件判斷通常優先使用短路版本。
| 需求 | 建議運算子 | 原因 |
|---|---|---|
| 計算完整分組 | \ 與 Mod |
可分別取得完整組數與剩餘數量。 |
| 判斷門檻 | >、<、>=、<= |
比較結果可直接交給 If。 |
| 組合多個條件 | AndAlso、OrElse |
具備短路判斷,較適合一般條件流程。 |
| 組合顯示文字 | & |
語意明確,不容易和加法混淆。 |
| 在原值上累加 | +=、-=、&= |
適合表達回存更新。 |
重點整理
- 運算子用來執行計算、比較、邏輯判斷、文字串連與結果指定。
- 算術運算子通常產生數值結果。
- 比較運算子與邏輯運算子通常產生
Boolean結果。 /是一般除法,\是整數除法,Mod是餘數。- 除法、整除與餘數都需要檢查除數不可為 0。
- 字串串連建議使用
&,不要依賴+混合處理。 AndAlso與OrElse具備短路判斷,適合一般條件組合。- 公式只要有多個運算子,就應善用括號讓計算順序更清楚。