算術演算子 (F#)
このトピックでは、F# 言語で使用できる算術演算子について説明します。
二項算術演算子の概要
次の表に、ボックス化解除された整数型と浮動小数点型に対して使用できる二項算術演算子の概要を示します。
二項演算子 |
説明 |
---|---|
+ (加算、プラス) |
オフ 数値を合計した結果が、型でサポートされている最大絶対値を超えると、オーバーフローが発生します。 |
- (減算、マイナス) |
オフ unsigned 型で減算を行った場合、または浮動小数点値が小さすぎてその型で表すことができない場合には、アンダーフローが発生する可能性があります。 |
* (乗算、×) |
オフ 数値を乗算した結果が、型でサポートされている最大絶対値を超えると、オーバーフローが発生します。 |
/ (除算、÷) |
整数型の場合、ゼロで除算すると DivideByZeroException が発生します。 浮動小数点型の場合、ゼロで除算した結果は、特別な浮動小数点値である +Infinity または -Infinity になります。 浮動小数点数が小さすぎてその型で表すことができない場合には、アンダーフローが発生します。 |
% (剰余、mod) |
除算演算の剰余を返します。 結果の符号は、最初のオペランドの符号と同じです。 |
** (指数演算、累乗) |
結果が型の最大絶対値を超えると、オーバーフローが発生します。 指数演算子は浮動小数点型でのみ使用できます。 |
単項算術演算子の概要
次の表に、整数型と浮動小数点型に対して使用できる単項算術演算子の概要を示します。
単項演算子 |
説明 |
---|---|
+ (正) |
すべての算術式に適用できます。 この演算子を使用しても、値の符号は変化しません。 |
- (否定、負) |
すべての算術式に適用できます。 この演算子を使用すると、値の符号が変わります。 |
整数型のオーバーフローまたはアンダーフロー時には、ラップが行われます。 このため、不正な結果になります。 ソフトウェアに整数のオーバーフローに対する処理が記述されていないと、セキュリティの懸案事項に影響する可能性がある、重大な問題が発生する場合があります。 作成したアプリケーションでこのことが問題になる場合は、Microsoft.FSharp.Core.Operators.Checked の checked 演算子の使用を検討してください。
二項比較演算子の概要
次の表に、整数型と浮動小数点型に対して使用できる二項比較演算子を示します。 これらの演算子は、bool 型の値を返します。
IEEE 浮動小数点表現では厳密な等値演算がサポートされていないため、浮動小数点数の等価比較を直接行わないでください。 コードを調べることによって等値かどうかを簡単に確認できる 2 つの数値も、実際のビット表現が異なる場合があります。
[演算子] |
説明 |
---|---|
= (等値、等しい) |
この演算子は代入演算子ではありません。 比較の場合にのみ使用します。 この演算子はジェネリック演算子です。 |
> (より大きい) |
この演算子はジェネリック演算子です。 |
< (より小さい) |
この演算子はジェネリック演算子です。 |
>= (以上) |
この演算子はジェネリック演算子です。 |
<= (以下) |
この演算子はジェネリック演算子です。 |
<> (等しくない) |
この演算子はジェネリック演算子です。 |
オーバーロードされた演算子とジェネリック演算子
このトピックで説明されているすべての演算子は、Microsoft.FSharp.Core.Operators 名前空間で定義されています。 一部の演算子は、静的に解決された型パラメーターを使用して定義されています。 これは、演算子で使用できる特定の型ごとに個別の定義があることを意味します。 単項算術演算子、二項算術演算子、およびビット処理演算子は、すべてこのカテゴリに属しています。 比較演算子はジェネリックです。したがって、プリミティブ数値型だけでなく、すべての型で使用できます。 判別共用体型とレコード型には、F# コンパイラによって生成される独自のカスタム実装があります。 クラス型では Equals メソッドを使用します。
ジェネリック演算子はカスタマイズできます。 比較関数をカスタマイズするには、Equals をオーバーライドしてカスタムの等価比較を指定し、IComparable を実装します。 IComparable インターフェイスのメソッドは 1 つです。これは、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