三路比较
计算机科学中,三路比较(three-way comparison)取具有全序的属于同一类型的2个值A和B,在一个操作中确定A < B, A = B, 或 A > B。这是数学上的三分律概念。
编程语言支持
[编辑]C语言的函数strcmp
和memcmp
在字符串之间、内存空间之间做三路比较。返回负值表示第一操作数在字典序上小于第二操作数;返回零表示2个操作数相等;返回正值表示第一操作数大于第二操作数。标准库的快排序函数qsort
把三路比较扩展到任何类型,要求提供一个执行比较的函数指针。
C++20引入了“航天飞船运算符”(spaceship operator)<=>
做三路比较。[1]
Perl(限数值比较,如果是字符串字典序比较要用cmp
运算符), PHP (从版本7), Ruby, Apache Groovy,都使用航天飞船运算符<=>
返回−1、0、1分别表示大于、等于、小于。 Python 2.x cmp
(被Python 3.x删除)、OCaml compare
, 和Kotlin的compareTo
函数做相应的事。Haskell标准库的三路比较函数compare
可用于所有属于Ord
类型类的类型,返回类型为Ordering
, 其值是LT
(小于), EQ
(相等), GT
(大于):[2]
data Ordering = LT | EQ | GT
许多面向对象编程语言的三路比较方法,在当前对象和其他给定对象之间三路比较。例如,Java语言中任何实现了Comparable
接口的类都有compareTo
(页面存档备份,存于互联网档案馆)方法,返回非负整数、零、正整数,或抛出一个NullPointerException
异常(如果一个或两个对象是null
)。类似地,.NET Framework中,任何实现了IComparable
接口的类都有CompareTo
(页面存档备份,存于互联网档案馆)方法。
从Java 1.5开始,也可以用Math.signum
静态方法。
航天飞船运算符
[编辑]Perl, PHP, Ruby, Apache Groovy,C++20等语言都使用航天飞船运算符<=>
。[3]
这个名字起源于Randal L. Schwartz在HP分时BASIC上的游戏Star Trek的星战飞船。[4]也有编程者建议按星球大战的钛战机命名。[5]
PHP例子:
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
参见
[编辑]
参考文献
[编辑]- ^ Herb Sutter proposed adding a three-way comparison operator to the C++ standard with the
<=>
syntax, in a paper entitled "Consistent Comparison". See "Consistent Comparison" (页面存档备份,存于互联网档案馆) It was successfully merged into the C++20 draft in November 2017. - ^ Data.Ord. [2022-03-06]. (原始内容存档于2022-03-06).
- ^ Math::Complex. Perl Programming Documentation. [26 September 2014]. (原始内容存档于2020-06-05).
- ^ Spaceship history (was Re: [dart-misc] DEP meeting notes). [2022-03-06]. (原始内容存档于2020-01-25).
- ^ Super Spaceship Operator. 2000-12-08 [2014-08-06]. (原始内容存档于2022-03-06).