跳转到内容

三路比较

维基百科,自由的百科全书

计算机科学中,三路比较(three-way comparison)取具有全序的属于同一类型的2个值A和B,在一个操作中确定A < B, A = B, 或 A > B。这是数学上的三分律概念。

编程语言支持

C语言的函数strcmpmemcmp在字符串之间、内存空间之间做三路比较。返回负值表示第一操作数字典序上小于第二操作数;返回零表示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, 和KotlincompareTo函数做相应的事。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英语Randal L. SchwartzHP分时BASIC英语HP Time-Shared BASIC上的游戏Star Trek的星战飞船。[4]也有编程者建议按星球大战钛战机命名。[5]

PHP例子:

echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 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.
  2. ^ Data.Ord. [2022-03-06]. (原始内容存档于2022-03-06). 
  3. ^ Math::Complex. Perl Programming Documentation. [26 September 2014]. (原始内容存档于2020-06-05). 
  4. ^ Spaceship history (was Re: [dart-misc] DEP meeting notes). [2022-03-06]. (原始内容存档于2020-01-25). 
  5. ^ Super Spaceship Operator. 2000-12-08 [2014-08-06]. (原始内容存档于2022-03-06).