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

What is the difference between ! ( x < y ) and x >= y in C++?

本文关键字:gt C++ 区别 lt 什么      更新时间:2023-10-16

在浏览EASTL时,我偶然发现了一行特殊的代码。以下链接显示了具有1870的感兴趣行号的文件。

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

那一行的代码是if(!(value < *i))。评论说"我们总是用<或==来表达价值比较",但没有解释为什么会这样。还有一些其他领域也发表了同样的评论,但没有任何解释。

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

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

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

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

我看到了至少一个区别。如果其中一个数字是QNAN(浮点0/0),那么!如果a或b中的任何一个是QNAN,(a<b)将始终返回TRUE,而对于a>=b

,它将始终返回false

只需使用小于运算符,就可以模拟所有其他比较运算符。这使它更加一致,并允许您在需要参数化比较时使用单个模板参数。例如,标准排序容器和算法使用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)

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