版权归原作者所有,如有侵权,请联系我们

[科普中国]-关系运算子

科学百科
原创
科学百科为用户提供权威科普内容,打造知识科普阵地
收藏

关系运算子在计算机科学的编程语言中,是测试或定义两个实体之间某种关系的构造或操作符。这些包括数值等式和不等式(例如 5 = 5 和 4≥3)。在具备布尔型别的编程语言中(如 Pascal,Ada 或 Java),这些运算符通常根据两个操作变量之间的条件关系是否成立,判定为真或假。诸如 C 语言中关系运算子返回整数 0 或 1,其中 0 表示假,任何非零值表示真。使用关系运算子创建的表达式,形成所谓的关系表达式或条件。 关系运算子可以被视为谓词逻辑的特殊情况。

相等性用法在许多编程语言构造和资料型别中都使用到相等性,它用于测试元素是否已存在于集合中,或者借由键来存取值。它在切换(switch)语句,以及编程的逻辑并联过程中,用于将控制流调度到正确的分支。相等性的可能含义之一是“如果 a 等于 b,那么我们可以在任何上下文中互换 a 或 b,而不会产生任何差异。但这样的声明不一定成立,尤其在可变性和内容等同性一起考虑时。1

物件相等与内容等同性有时,特别是在面向对象编程中,对资料型别和继承物件进行比对时,出现了相等性和辨别的问题。以下情况通常需要区别:

相同型别的两个不同物件,例如两只手

两个物件相等但不同,例如两张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)或协定的形式,定义了“可比较”的明确概念,以源码中的显式声明,被借由型别的结构,来使用关系运算。1

比较不同类型的值JavaScript,PHP 和一些其它动态型别的语言中,如果两个值相等,等号运算符将计算为真,即使它们实际上为不同型别的物件,例如以数值4和字串"4"相比较,结果会是相等。在这类语言中通常也会提供型别相等运算子,仅对具有相同或等价型别的物件比较返回真(在PHP 5中 4 ==="4"为假,但 4 =="4" 为真)。而在将数值0也当作布尔值为假的编程语言中,该运算子可化简为检查物件是否为数值零(例如,对于数值0或字串"0"的x物件,使用型别相等运算子,则 x == 0 判断传回真值)。1

次序比较非数值资料的次序比较(大于或小于)运算是根据排序惯例(例如字串依照编程语言内定的字典次序,和/或可由开发人员设定的)。当两个资料项 a 和 b 之间的比较结果,要和数值关联时,通常惯例是如果 a b 则为 1。例如C语言的函数strcmp执行三方向比较,并根据此惯例返回 -1, 0 或 1,而qsort预期比较函数依此惯例返回值。在排序算法中比较方法源码的效率至为关键,因为它是排序性能的主要因素之一。

开发人员定义的资料型别(不是编程语言内建的型别)的比较,可以编写自订的或使用函式库的函数(如上文的strcmp)来执行,或者在某些语言中通过重载比较运算符-即以开发人员的定义指派给比较运算子,来比较特定资料型别。另一个选择是使用某些惯例,例如成员比较。

逻辑等价虽然一开始可能不那么显而易见,像布尔逻辑运算符 XOR,AND,OR 和 NOT,这些关系运算子可以设计为具有逻辑等同性,使得它们都可以相互定义。对于任何给定的 x 和 y 值,以下四个条件语句都有相同的逻辑等价性 E(全为真或全为假):

这依赖于域是良好排序的。

语法关系运算子也用于技术文献而不是单词,如果编程语言支援通常以中缀表示法,亦即出现在其操作变量(两个表达式是相关的)之间。 举例而言如果 x 小于 y,在Python中的表达式将印出句子:

if x = X Y)操作符链接链接关系在数学中是普遍的写法,例如 3