有什么区别! C ++中的(x< y)和x> = y?

时间:2012-01-05 03:16:19

标签: c++ comparison-operators

通过EASTL,我偶然发现了一行特殊的代码。以下链接显示了感兴趣的行号为1870的文件。

https://github.com/paulhodge/EASTL/blob/master/include/EASTL/algorithm.h

该行的代码为if(!(value < *i))。评论说“我们总是用&lt;或==”来表达价值比较,而不解释为什么会这样。还有一些其他区域放置相同的评论,但没有任何解释。

写这样的比较有什么好处(也许是我忽略的一些背景)?如果没有,为什么EASTL的作者故意以这种特殊的方式写它,甚至小心翼翼地对它发表评论?一致性是唯一的原因吗?

4 个答案:

答案 0 :(得分:11)

这意味着您只需要为容器值类型提供<==。它还意味着您可以减少这些类型的可变性(因为所有算法都使用!(a<b)表示a>=b!(a==b)表示a!=b);否则,您可能会>=!=返回不一致的结果。

答案 1 :(得分:8)

在C ++中,您可以重载<运算符,使其行为与>=的反向运算方式不同,因此不能保证它们等效。

此外,在任何IEEE浮点实现中,NaN < NaN为false,,但 NaN >= NaN也是如此,因此即使!(NaN < NaN)NaN >= NaN也是如此是假的。

答案 2 :(得分:1)

我看到至少有一个区别。如果其中一个数字是QNAN(浮点0/0)那么!(a&lt; b)如果a或b中的任何一个是QNAN则总是返回TRUE,而对于&gt; =它总是返回false b'/ p>

答案 3 :(得分:1)

只使用less-than运算符,可以模拟所有其他比较运算符。这使得它更加一致,并允许您在需要参数化比较时使用单个模板参数。标准排序容器和算法使用std::less<T>作为默认模板比较器。

operation  equivalent
x < y      x < y
x > y      y < x
x <= y     !(y < x)
x >= y     !(x < y)
x == y     !(x < y) && !(y < x)
x != y     (x < y) || (y < x)

对于那些排序不重要的操作,使用运算符==会更简单,更有效。