三路比較

計算機科學中,三路比較(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).