三路比较

计算机科学中,三路比较(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. SchwartzHP分时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. . [2022-03-06]. (原始内容存档于2022-03-06).
  3. . Perl Programming Documentation. [26 September 2014]. (原始内容存档于2020-06-05).
  4. . [2022-03-06]. (原始内容存档于2020-01-25).
  5. . 2000-12-08 [2014-08-06]. (原始内容存档于2022-03-06).
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.