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