关系运算符在计算机科学的编程语言中,是测试或定义两个实体之间某种关系的构造或操作符。这些包括数值等式和不等式(例如 5 = 5 和 4≥3)。在具备布尔类型的编程语言中(如 Pascal,Ada 或 Java),这些运算符通常根据两个操作变量之间的条件关系是否成立,判定为真或假。诸如 C 语言中关系运算符返回整数 0 或 1,其中 0 表示假,任何非零值表示真。使用关系运算符创建的表达式,形成所谓的关系表达式或条件。关系运算符可以被视为谓词逻辑的特殊情况。
在许多编程语言构造和数据类型中都使用到相等性,它用于测试元素是否已存在于集合中,或者借由键来访问值。它在切换(switch)语句,以及编程的逻辑并联过程中,用于将控制流调度到正确的分支。相等性的可能含义之一是“如果 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(全为真或全为假):
这依赖于域是良好排序的。
在编程语言中最常见到的数值关系运算符如下所示。
其他较少见的:Common Lisp的不等关系运算符是 /=,Macsyma/Maxima 的不等关系运算符是 #。旧的Lisp使用equal,greaterp 和 lessp; 而以not运算符作逻辑否定。
关系运算符也用于技术文献而不是单词,如果编程语言支持通常以中缀表示法,亦即出现在其操作变量(两个表达式是相关的)之间。举例而言如果 x 小于 y,在Python中的表达式将印出句子:
if x < y: print("x is less than y in this example")