算術運算子 (F#)
本主題描述 F# 語言中可用的算術運算子。
二元算術運算子摘要
下表摘要說明可用於 Unboxed 整數和浮點型別的二元算術運算子。
二元運算子 |
備註 |
---|---|
+ (加法、加上) |
未檢查。 當數字相加,總和超出型別所支援的最大絕對值時,可能發生溢位狀況。 |
- (減法、減去) |
未檢查。 當減去不帶正負號的型別時,或者當浮點值太小,無法由型別表示時,可能發生反向溢位狀況。 |
* (乘法、相乘) |
未檢查。 當數字相乘,乘積超出型別所支援的最大絕對值時,可能發生溢位狀況。 |
/ (除法、除以) |
如果是整數型別,除數為零時會引發 DivideByZeroException。 如果是浮點型別,除數為零時會產生特殊浮點值 +Infinity 或 -Infinity。 當浮點數太小,無法由型別表示時,也可能會發生反向溢位狀況。 |
% (模數、取餘數) |
傳回除法運算的餘數。 結果的符號與第一個運算元的符號相同。 |
** (乘冪、自乘至乘冪) |
當結果超出型別的最大絕對值時,可能發生溢位狀況。 乘冪運算子只適用於浮點型別。 |
一元算術運算子摘要
下表摘要說明可用於整數和浮點型別的一元算術運算子。
一元運算子 |
備註 |
---|---|
+ (正) |
可以套用至任何算術運算式。 不會變更值的正負號。 |
- (負運算、負) |
可以套用至任何算術運算式。 會變更值的正負號。 |
如果是整數型別,在溢位或反向溢位時的行為是循環, 這會導致不正確的結果。 整數溢位可能是嚴重的問題,特別是當撰寫軟體時未考量此狀況時,可能導致安全性問題。 如果這對您的應用程式是個顧慮,請考慮使用 Microsoft.FSharp.Core.Operators.Checked 中已經過檢查的運算子。
二元比較運算子摘要
下表說明可用於整數和浮點型別的二元比較運算子。 這些運算子會傳回 bool 型別的值。
浮點數絕不能針對相等性直接進行比較,因為 IEEE 浮點表示不支援完全相等運算。 透過檢查程式碼輕易驗證為相等的兩個數字,可能會有不同的位元表示。
運算子 |
備註 |
---|---|
= (相等、等於) |
這不是指派運算子, 而只能用於比較。 這是泛型運算子。 |
> (大於) |
這是泛型運算子。 |
< (小於) |
這是泛型運算子。 |
>= (大於或等於) |
這是泛型運算子。 |
<= (小於或等於) |
這是泛型運算子。 |
<> (不等於) |
這是泛型運算子。 |
多載和泛型運算子
本主題討論的所有運算子都是在 Microsoft.FSharp.Core.Operators 命名空間中定義。 其中部分運算子是透過靜態解析型別參數來定義, 這表示與該運算子搭配使用的每個型別都有個別的定義。 所有一元和二元算術運算子以及位元運算子都屬於此分類。 比較運算子為泛型,因此可與任何型別搭配使用,而不只是基本算術型別。 已區分的聯集和記錄型別都有 F# 編譯器所產生的各自專屬自訂實作。 類別型別會使用 Equals 方法。
泛型運算子是可自訂的。 若要自訂比較函式,請覆寫 Equals 並提供您的自訂相等比較,然後實作 IComparable。 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