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) です。