算術演算子
このトピックでは、F# で使用できる算術演算子について説明します。
二項算術演算子の概要
次の表は、ボックス化解除された整数型と浮動小数点型で使用できる二項算術演算子をまとめたものです。
2 項演算子 | Notes |
---|---|
+ (加算、足す) |
Unchecked。 数値が加算され、合計がその型でサポートされる最大絶対値を超えた場合にオーバーフロー状態が発生する場合があります。 |
- (減算、引く) |
Unchecked。 符号なしの型が減算される場合、または浮動小数点値が小さすぎて型で表すことができない場合にアンダーフロー状態が発生する場合があります。 |
* (乗算、掛ける) |
Unchecked。 数値が乗算され、その積がその型でサポートされる最大絶対値を超えた場合にオーバーフロー状態が発生する場合があります。 |
/ (除算、割る) |
0 による除算では、整数型に対して DivideByZeroException が発生します。 浮動小数点型の場合、0 による除算によって、infinity または -infinity の特殊な浮動小数点数が得られます。 浮動小数点数が小さすぎて型で表現できない場合にも、アンダーフロー状態が発生する場合があります。 |
% (剰余、rem) |
除算演算の剰余を返します。 結果の符号は、最初のオペランドの符号と同じです。 |
** (べき乗、べき指数) |
結果がその型の最大絶対値を超える場合にオーバーフロー状態が発生する場合があります。 べき乗演算子は、浮動小数点型でのみ動作します。 |
単項算術演算子の概要
次の表は、整数型と浮動小数点型で使用できる単項算術演算子をまとめたものです。
単項演算子 | Notes |
---|---|
+ (正) |
任意の算術式に適用できます。 値の符号は変更されません。 |
- (否定、負) |
任意の算術式に適用できます。 値の符号が変更されます。 |
整数型のオーバーフローまたはアンダーフロー時の動作は、ラップです。 これにより、正しくない結果が発生します。 整数オーバーフローは重大な問題となり、ソフトウェアがそれを考慮して記述されていない場合、セキュリティの問題が発生するおそれがあります。 これがアプリケーションの問題である場合は、Microsoft.FSharp.Core.Operators.Checked
で Checked 演算子を使用することを検討してください。
二項比較演算子の概要
次の表は、整数型と浮動小数点型で使用できる二項比較演算子を示しています。 これらの演算子は bool
の型の値を返します。
IEEE 浮動小数点表現では厳密な等値演算がサポートされていないため、浮動小数点数で等価性を直接比較することはできません。 コードを検査することで簡単に確認できる 2 つの数値が、実際には異なるビット表現を持つ場合があります。
演算子 | Notes |
---|---|
= (等値、等しい) |
これは代入演算子ではありません。 比較でのみ使用されます。 これは汎用演算子です。 |
> (より大きい) |
これは汎用演算子です。 |
< (より小さい) |
これは汎用演算子です。 |
>= (以上) |
これは汎用演算子です。 |
<= (以下) |
これは汎用演算子です。 |
<> (等しくない) |
これは汎用演算子です。 |
オーバーロードされた汎用演算子
このトピックで説明するすべての演算子は、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
関連項目
.NET