有什么区别!( x < y ) 和 x >= y 在C++?
What is the difference between ! ( x < y ) and x >= y in C++?
在浏览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
只需使用小于运算符,就可以模拟所有其他比较运算符。这使它更加一致,并允许您在需要参数化比较时使用单个模板参数。例如,标准排序容器和算法使用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)
对于那些排序不重要的操作,使用运算符==
更简单、更高效。
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- C 字符串比较“祝您好运”&gt;“再见”
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- C 操作员&gt;&gt;与突变器过载
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 是否需要使用 - &gt;运算符在C 中调用成员函数时
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- 错误c++visual studio c2227左侧'->;Init';必须指向类/结构/联合/泛型类型
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- ``这个''不能用this-&gt;指针变量
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 使用shared_ptr<字符串>转换为一个无序集合<字符串>
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到