算術運算子
本主題描述 F# 中可用的算術運算子。
二進位算術運算子摘要說明
下表摘要說明 Unboxed 整數和浮點型別可用的二進位算術運算子。
二元運算子 | 備註 |
---|---|
+ (加法、加號) |
已取消核取。 數值相加且總和超過型別支援的最大絕對值時,可能發生的溢位條件。 |
- (減法、減號) |
已取消核取。 減去不帶正負號的型別,或浮點值過小而無法由型別表示時,可能發生的反向溢位條件。 |
* (乘法、倍數) |
已取消核取。 數值相乘且乘積超過型別支援的最大絕對值時,可能發生的溢位條件。 |
/ (除法、相除) |
除以零會產生整數型別的 DivideByZeroException。 如為浮點型別,除以零會產生特殊浮點值 infinity 或 -infinity 。 如果浮點數太小而無法由型別表示,也可能會發生反向溢位條件。 |
% (餘數、剩餘) |
傳回除法運算後的餘數。 結果的正負號會與第一個運算元的正負號相同。 |
** (乘冪、次方) |
結果超過型別的最大絕對值時,可能發生的溢位條件。 乘冪運算子僅適用浮點型別。 |
一元算術運算子的摘要說明
下表摘要說明整數和浮點型別可用的一元算術運算子。
一元運算子 | 備註 |
---|---|
+ (正數) |
可以套用至任何算術運算式。 不會變更值的正負號。 |
- (負數、負) |
可以套用至任何算術運算式。 會變更值的正負號。 |
整數型別的溢位或反向溢位行為是換行。 這會導致不正確的結果。 整數溢位可能會是嚴重問題,會在軟體寫入時未考量安全性的情況下,引起安全性問題。 如果您的應用程式需考量安全性,建議在 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