算術運算子
本主題描述 F# 中可用的算術運算子。
二元算術運算子的摘要
F# 中的算術運算可以透過兩種模式執行:非檢查模式 和 檢查模式。 根據預設,算術運算會使用不檢查的行為,這樣可以優先提升效能,但允許發生溢位/下溢。 已檢查的運算子會拋出例外,以優先考慮安全性。
未核取的算術運算符
下表總結了提供給 Unchecked 算術 的未包裝整數和浮點類型的二元算術運算子。
二元運算子 | 筆記 |
---|---|
+ (加號) |
未選取 當數位加在一起且總和超過類型所支援的最大絕對值時,可能的溢位條件。 |
- (減法、減號) |
未選中。 當無符號類型進行減法運算時,或浮點值太小而無法由類型表示時,可能會發生下溢情況。 |
* (乘法,時間) |
未經檢查。 當數位相乘且產品超過類型所支援的最大絕對值時,可能的溢位條件。 |
/ (除法,除以) |
除以零會導致整數型別 DivideByZeroException。 對於浮點類型,除以零提供特殊的浮點值 infinity 或 -infinity 。 當浮點數太小而無法以類型表示時,也可能會有下溢條件。 |
% (餘數,rem) |
傳回除法運算的其餘部分。 結果的正負號與第一個操作數的正負號相同。 |
** (指數,次方) |
當結果超過該類型的最大絕對值時,可能會發生溢位狀況。 指數運算子只適用於浮點類型。 |
未檢查的行為在發生溢出或下溢出時不會引發例外處理,因此對於大型或邊界情況的數值運算較不安全。
已檢查算術運算子
下表摘要說明可用於 檢查過的算術 的未封裝整數類型的二進位算術運算符。 已檢查的運算子可確保計算經過溢出或下溢驗證,為重要應用程式提供更安全的算術。
二元運算子 | 筆記 |
---|---|
+ (加號加號) |
如果結果超過最大值或低於類型支援的最小值,則擲回 OverflowException。 溢位 和 下溢 都可行。 |
- (減法、減號) |
如果結果超過最大值或低於類型支援的最小值,則擲回 OverflowException。 溢位 和 下溢 都有可能發生。 |
* (乘法,次數) |
如果產品超過最大值或低於類型支援的最小值,則擲回 OverflowException。 溢位 和 下溢 都可行。 |
經過檢查的運算子有助於確保算術溢位被正確攔截並明確處理。
以下是範例:
open Microsoft.FSharp.Core.Operators.Checked
let safeAddition () =
try
let result = 2147483647 + 1 // Attempt to add integers at their maximum boundary
printfn "Result: %d" result
with
| :? System.OverflowException as ex ->
printfn "Overflow occurred: %s" ex.Message
safeAddition()
// Output:
// Overflow occurred: Arithmetic operation resulted in an overflow.
在已核取和未核取的運算符之間選擇
檢查運算符: 適用於必須明確偵測和處理溢位錯誤的案例。
未檢查的運算符: 根據預設,F# 為了效能的緣故,會使用未檢查的運算。 當發生溢位或下溢時,這些作業可能會以無訊息方式產生不正確的結果。 請小心使用。
一元算術運算子的摘要
下表摘要說明整數和浮點數類型可用的一元算術運算元。
一元運算子 | 筆記 |
---|---|
+ (正面) |
可以套用至任何算術表達式。 不會變更值的符號。 |
- (否定,負面) |
可以套用至任何算術表達式。 變更值的符號。 |
整數型別溢位或下溢的行為是繞行。 這會導致不正確的結果。 整數溢位是一個潛在的嚴重問題,當軟體在撰寫時未考慮時,可能會導致安全性問題。 如果這是應用程式的問題,請考慮在 Microsoft.FSharp.Core.Operators.Checked
中使用已核取的運算符。
二元比較運算子的摘要
下表顯示可用於整數和浮點類型的二進位比較運算符。 這些運算符會傳回類型為 bool
的值。
浮點數不應該直接比較是否相等,因為 IEEE 浮點表示不支援完全相等運算。 檢查程式代碼時,您可以輕鬆地確認是否相等的兩個數字實際上可能會有不同的位表示法。
操作員 | 筆記 |
---|---|
= (平等、相等) |
這不是指派運算符。 它僅用於比較。 這是泛型運算子。 |
> (大於) |
這是泛型運算子。 |
< (小於) |
這是泛型運算子。 |
>= (大於或等於) |
這是泛型運算子。 |
<= (小於或等於) |
這是泛型運算子。 |
<> (不相等) |
這是泛型運算子。 |
多載和泛型運算子
本主題中討論的所有運算符都會定義在命名空間 Microsoft.FSharp.Core.Operators。 某些運算子是使用靜態解析的類型參數來定義。 這表示每個特定類型都有個別的定義,可搭配該運算符使用。 所有一元和二進位算術和位運算子都在此類別中。 比較運算符是泛型的,因此適用於任何類型,而不只是基本算術類型。 判別聯合和紀錄類型有自己的自訂實作,由 F# 編譯器產生。 類別類型使用 方法 Equals。
泛型運算子是可自定義的。 若要自訂比較函式,請覆寫 Equals 以提供您自己的自訂相等比較,然後實作 IComparable。 System.IComparable 介面具有單一方法,CompareTo 方法。
運算子和類型推斷
表達式中的運算子使用會限制該運算子的類型推斷。 此外,運算子的使用可防止自動一般化,因為運算符的使用意指算術類型。 如果沒有任何其他資訊,F# 編譯程式會將 int
推斷為算術表達式的類型。 您可以藉由指定其他類型來覆蓋此行為。 因此,下列程式代碼中 function1
的自變數類型和傳回型別會推斷為 int
,但 function2
的類型會推斷為 float
。
// x, y and return value inferred to be int
// function1: int -> int -> int
let function1 x y = x + y
// x, y and return value inferred to be float
// function2: float -> float -> float
let function2 (x: float) y = x + y