operator <, <=, >, >=
id:faith_and_brave:20071120:1195555037 を読んでいて思い出したのでメモ.
忘れがちなのでメモ
<, <=, >, >= 演算子の定義方法
struct widget { int id; }; bool operator<(const widget& lhs, const widget& rhs) { return lhs.id < rhs.id; } bool operator>(const widget& lhs, const widget& rhs) { return rhs < lhs; } bool operator<=(const widget& lhs, const widget& rhs) { return !(rhs < lhs); } bool operator>=(const widget& lhs, const widget& rhs) { return !(lhs < rhs); }
C# 3.0 にて実験.
< の定義
lhs > rhs
縦が lhs で横が rhs.
0.0 | 1.0 | NaN | +∞ | |
---|---|---|---|---|
0.0 | False | True | False | True |
1.0 | False | False | False | True |
NaN | False | False | False | False |
+∞ | False | False | False | False |
これを myLessThan とします.
> の定義
lhs > rhs をそのまま計算.
0.0 | 1.0 | NaN | +∞ | |
---|---|---|---|---|
0.0 | False | False | False | False |
1.0 | True | False | False | False |
NaN | False | False | False | False |
+∞ | True | True | False | False |
myLessThan(rhs, lhs)の場合.
0.0 | 1.0 | NaN | +∞ | |
---|---|---|---|---|
0.0 | False | False | False | False |
1.0 | True | False | False | False |
NaN | False | False | False | False |
+∞ | True | True | False | False |
OK.
<= の定義
lhs <= rhs をそのまま計算.
0.0 | 1.0 | NaN | +∞ | |
---|---|---|---|---|
0.0 | True | True | False | True |
1.0 | False | True | False | True |
NaN | False | False | False | False |
+∞ | False | False | False | True |
!myLessThan(rhs, lhs) の場合
0.0 | 1.0 | NaN | +∞ | |
---|---|---|---|---|
0.0 | True | True | True | True |
1.0 | False | True | True | True |
NaN | True | True | True | True |
+∞ | False | False | True | True |
NaN で結果が異なる.
>= の場合
lhs >= rhs をそのまま計算.
0.0 | 1.0 | NaN | +∞ | |
---|---|---|---|---|
0.0 | True | False | False | False |
1.0 | True | True | False | False |
NaN | False | False | False | False |
+∞ | True | True | False | True |
!myLessThan(lhs, rhs)
0.0 | 1.0 | NaN | +∞ | |
---|---|---|---|---|
0.0 | True | False | True | False |
1.0 | True | True | True | False |
NaN | True | True | True | True |
+∞ | True | True | True | True |
NaN で結果が異なる.
というわけで,元のコードのように int に対して使う分には問題ありませんが,IEEE 754 浮動小数点数や Nullable には使えませんのでご注意を.
って自分で書くときに忘れててやっちゃいそうなのでメモと.
Double.CompareTo(y) とか Comparer<double>.Default.Compare(x, y) とか
そういえば Double.CompareTo も細かく見ると結構厄介ですな.
戻り値 説明 0 より小さい値 このインスタンスは、value よりも小さくなっています。またはこのインスタンスは非数 (NaN) で、value は数値です。 0 このインスタンスは value と等価です。またはこのインスタンスと value は、どちらも非数 (NaN)、PositiveInfinity、または NegativeInfinity です。 0 より大きい値 このインスタンスは value よりも大きくなっています。またはこのインスタンスは数値で、value は非数 (NaN) です。