關係運算子在電腦科學的程式語言中,是測試或定義兩個實體之間某種關係的構造或運算子。一共有六種關係,分別為:小于(<)大于(>)小于或等于(<=)大于或等于(>=)等于(==)不等于(<>)。在具備布爾型別的程式語言中(如 Pascal,Ada 或 Java),這些運算子通常根據兩個操作變數之間的條件關係是否成立,判定為真(True)或假(False)。諸如 C 語言中關係運算子傳回整數 0 或 1,其中 0 表示假,任何非零值表示真。使用關係運算子創建的表達式,形成所謂的關係表達式或條件。 關係運算子可以被視為謂詞邏輯的特殊情況。

相等性

用法

許多程式語言的構造和資料型別中都使用到相等性,用於測試元素是否已存在於集合中,或者藉由鍵來存取值。它在切換(switch)陳述式,以及編程的邏輯併聯過程中,用於將控制流調度到正確的分支。相等性的可能含義之一是「如果 a 等於 b,那麼我們可以在任何情況下互換 a 或 b,而不會產生任何差異。」但這樣的聲明不一定成立,尤其在將可變性和內容等同性一起考慮時。

物件相等與內容等同性

有時,特別是在物件導向編程中,對資料型別和繼承物件進行比對時,出現了相等性和辨別的問題。以下情況通常需要區別:

  • 相同型別的兩個不同物件,例如兩隻手
  • 兩個物件相等但不同,例如兩張10元鈔票
  • 兩個物件相等但有不同的呈現,例如$1元紙鈔和$1元硬幣
  • 對同一物件的兩個不同參照,例如,同一人的兩個暱稱

在許多現代程式語言中會藉由參照來存取物件和資料結構。在這些語言中,需要測試兩種相等性質:

  • 實質同等性:如果有兩個參照A和B來自參照同一個物件,以A與物件進行的互動,跟藉由B與物件進行的互動,兩者其實就是相同作用而無法區別,特別是以A去改變物件的異動會反映在B之上。當討論為值而非物件時,實質同等性並不適用。
  • 語義同等性:如果兩個參照物件或兩個值在某種意義上是等價的:
    • 結構等式(即它們的內容是相同的),或淺薄地(僅測試目前部份)或深入地(遞歸地測試其所有部份的相等性)。實現這一點的簡易方法是通過代表等式:檢查參照的值是否有相同的代表式。
    • 其它特製的同等性,保留外部行為。例如將視為有理數時,被判斷是相等的。除了反射性對稱性傳遞性之外,對 A = B 特製的定義可能是「若且唯若對於物件A和物件B之上的所有操作,都將具有相同的結果時,則 A = B 」。

第一種同等性質通常蘊涵着第二種同等性質(除了非數字類(not a number, NaN),它們不等於自身),但反向的同等性質並不一定成立。例如兩個字串物件可以是不同物件(第一種意義不相等),但它們包含相同的字元序列(第二種意義上相等)。有關此問題的更多資訊,請參閱識別(identity)。

實數中包括許多簡分數,無法以浮點算數精確地表示,所以需要在給定誤差範圍內來測試相等性。但這樣的誤差範圍將打破一些例如傳遞性、反身性的要求性質:IEEE浮點標準是判斷 Nan ≠ NaN 成立(NaN不等於自身)。

其他編程元素例如可計算的函數,可能沒有相等性的意義,或者相等性是不能計算的。由於這些原因,一些語言以基礎類別、介面、特點(trait)或協定的形式,定義了「可比較」的明確概念,以原始碼中的顯式聲明,被藉由型別的結構,來使用關係運算。

比較不同類型的值

JavaScript,PHP 和一些其它動態型別的語言中,如果兩個值相等,等號運算子將計算為真,即使它們實際上為不同型別的物件,例如以數值4和字串"4"相比較,結果會是相等。在這類語言中通常也會提供型別相等運算子,僅對具有相同或等價型別的物件比較返回真(在PHP 5中 4 ==="4"為假,但 4 =="4" 為真)。而在將數值0也當作布爾值為假的程式語言中,該運算子可化簡為檢查物件是否為數值零(例如,對於數值0或字串"0"的x物件,使用型別相等運算子,則 x == 0 判斷傳回真值)。

次序比較

非數值資料的次序比較(大於或小於)運算是根據排序慣例(例如字串依照程式語言內定的字典次序,和/或可由開發人員設置的)。當兩個資料項 a 和 b 之間的比較結果,要和數值關聯時,通常慣例是如果 a < b 則結果賦值為 -1,如果 a = b 則為 0,如果 a > b 則為 1。例如C語言的函數strcmp執行三方向比較,並根據此慣例返回 -1, 0 或 1,而qsort預期比較函數依此慣例返回值。在排序演算法中比較方法原始碼的效率至為關鍵,因為它是排序效能的主要因素之一。

開發人員定義的資料型別(不是程式語言內建的型別)的比較,可以編寫自訂的或使用函式庫的函數(如上文的strcmp)來執行,或者在某些語言中通過重載比較運算子-即以開發人員的定義指派給比較運算子,來比較特定資料型別。另一個選擇是使用某些慣例,例如成員比較。

邏輯等價

雖然一開始可能不那麼顯而易見,像布爾邏輯運算子 XOR,AND,OR 和 NOT,這些關係運算子可以設計為具有邏輯等同性,使得它們都可以相互定義。對於任何給定的 x 和 y 值,以下四個條件陳述式都有相同的邏輯等價性 E(全為真或全為假):

這依賴於域是良好排序的。

標準關係運算子

語法

另見

參考

Wikiwand in your browser!

Seamless Wikipedia browsing. On steroids.

Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.

Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.