En ciencias de la computación, un operador relacional es una construcción de un lenguaje de programación o un operador que comprueba o define algún tipo de relación entre dos entidades. Incluyen la igualdad numérica (como por ejemplo, ) y las desigualdades (como por ejemplo, ).

En los lenguajes de programación que incluyen un tipo de dato lógico distinto en su sistema de tipos, como Pascal, Ada o Java, estos operadores generalmente se evalúan como verdadero o falso, dependiendo de si la relación condicional entre los dos operandos se cumple o no. En lenguajes como C, los operadores relacionales devuelven los números enteros 0 o 1, donde 0 representa falso y cualquier valor distinto de cero representa verdadero.

Una expresión creada utilizando un operador relacional forma lo que se denomina una expresión relacional o una condición. Los operadores relacionales pueden verse como casos especiales de predicados lógicos.

Igualdad

Uso La igualdad se utiliza en muchas construcciones de lenguajes de programación y tipos de datos. Se emplea para probar si un elemento ya existe en un conjunto, o para acceder a un valor a través de una clave. Se utiliza en selección de casos para enviar el flujo de control a la rama correcta y durante el proceso de unificación en programación lógica.

Un posible significado de la igualdad es que "si a es igual a b, entonces a o b pueden usarse indistintamente en cualquier contexto sin notar ninguna diferencia". Pero esta afirmación no necesariamente se cumple, particularmente cuando se tiene en cuenta la mutabilidad junto con la igualdad del contenido.

Igualdad de ubicación frente a igualdad de contenido A veces, particularmente en programación orientada a objetos, la comparación plantea preguntas sobre tipos de datos y herencia, igualdad e identidad. A menudo es necesario distinguir entre: Dos objetos diferentes del mismo tipo, por ejemplo, dos manos Dos objetos iguales pero distintos, por ejemplo, dos billetes de 10 dólares Dos objetos iguales pero con representación diferente, por ejemplo, un billete de 1 dólar y una moneda de 1 dólar Dos referencias diferentes al mismo objeto, por ejemplo, dos apodos para la misma persona

En muchos lenguajes de programación modernos, se accede a objetos y estructuras de datos a través de referencias. En tales lenguajes, surge la necesidad de comprobar dos tipos diferentes de igualdad: Igualdad de ubicación (identidad): si dos referencias (A y B) hacen referencia al mismo objeto. Las interacciones con el objeto a través de A son indistinguibles de las mismas interacciones a través de B y, en particular, los cambios en el objeto a través de A se reflejan a través de B. Igualdad de contenido: si los objetos referenciados por dos referencias (A y B) son equivalentes en algún sentido: Igualdad estructural (es decir, sus contenidos son iguales) que puede ser superficial (comprobar solo subpartes inmediatas) o profundo (comprobar la igualdad de subpartes de forma recursiva). Una forma sencilla de lograrlo es mediante la igualdad representacional: comprobando que los valores tengan la misma representación. Alguna otra igualdad hecha a medida, preservando el comportamiento externo. Por ejemplo, 1/2 y 2/4 se consideran iguales cuando se consideran números racionales. Un posible requisito sería que "A = B si y solo si todas las operaciones sobre los objetos A y B tendrán el mismo resultado", además de reflexividad, simetría y transitividad.

El primer tipo de igualdad suele implicar el segundo (excepto cosas como "no es un número" (NaN) que no son iguales a sí mismas), pero lo contrario no es necesariamente cierto. Por ejemplo, dos objetos como cadenas de caracteres pueden ser objetos distintos (desiguales en el primer sentido) pero contener la misma secuencia de caracteres (iguales en el segundo sentido). Consúltese identidad para obtener más información sobre este problema.

Los números reales, incluidas muchas fracciones simples, no se pueden representar exactamente en coma flotante y puede ser necesario probar la igualdad dentro de una tolerancia determinada. Sin embargo, dicha tolerancia puede romper fácilmente propiedades deseadas como la transitividad, mientras que la reflexividad también se rompe: el estándar de coma flotante IEEE requiere que "NaN ≠ NaN" se cumpla. Por el contrario, el estándar privado aritmético para úmeros en formato posit (2022) (los promotores de la propuesta pretenden reemplazar los valores de coma flotante IEEE) tiene un concepto similar, NaR (Not a Real), donde se cumple NaR = NaR.Standard for Posit Arithmetic (2022)

Otros elementos de programación, como las funciones computables, pueden no tener ningún sentido de igualdad o tener una igualdad que no sea computable. Por estas razones, algunos lenguajes definen una noción explícita de "comparable", en forma de clase base, interfaz, rasgo o protocolo, que se utiliza explícitamente, mediante declaración en el código fuente, o implícitamente, a través de la estructura del tipo involucrado.

Comparación de valores de diferentes tipos En JavaScript, PHP, VBScript y algunos otros lenguajes escritos dinámicamente, el operador de igualdad estándar se evalúa como "verdadero" si dos valores son iguales, incluso si tienen tipos diferentes, lo que hace que el número 4 se compare con la cadena de texto "4", por ejemplo. En dichos lenguajes también suele estar disponible un operador de igualdad escrito que devuelve verdadero solo para valores con tipos idénticos o equivalentes (en PHP, 4=== "4" es falso aunque 4== "4" es verdadero). Para lenguajes de programación en los que el número 0 puede interpretarse como "falso", este operador puede simplificar cosas como verificar cero (ya que x== 0 sería verdadero si x fuera tanto 0 como "0", utilizando el operador de igualdad independiente del tipo).

Ordenación La comparación "mayor que" y "menor que" de datos no numéricos se realiza de acuerdo con una convención de clasificación (como, para las cadenas de texto, el orden lexicográfico) que puede estar integrada en el lenguaje de programación y/o ser configurable mediante programación.

Cuando se desea asociar un valor numérico con el resultado de una comparación entre dos elementos de datos, digamos a y b, la convención habitual es asignar −1 si a < b, 0 si a = by 1 si a > b. Por ejemplo, la función C cadenas de texto en C realiza una comparación a tres sentidos y devuelve −1, 0 o 1 según esta convención, y qsort espera que la función de comparación devuelva valores según esta convención. En algoritmos de ordenamiento, la eficiencia del código de comparación es fundamental, ya que es uno de los principales factores que contribuyen al rendimiento de la clasificación.

La comparación de tipos de datos definidos por el programador (para los que el lenguaje de programación no tiene comprensión incorporada) se puede llevar a cabo mediante funciones de biblioteca o escritas a medida (como la strcmp mencionada anteriormente) o, en algunos lenguajes, mediante sobrecarga de un operador de comparación, es decir, que asigna un significado definido por el programador que depende de los tipos de datos que se comparan. Otra alternativa es utilizar alguna convención, como la comparación entre miembros.

Equivalencia lógica Aunque quizás no sea obvio al principio, como los operadores lógicos boleanos XOR, AND, OR y NOT, los operadores relacionales pueden diseñarse para tener equivalencia lógica, de modo que todos puedan definirse en términos de otros. Las siguientes cuatro declaraciones condicionales tienen la misma equivalencia lógica E (todas verdaderas o todas falsas) para cualquier valor dado de x e y:

Esto depende de que el dominio esté bien ordenado.

Operadores relacionales estándar A continuación se muestran los operadores relacionales numéricos más comunes utilizados en los lenguajes de programación. El SQL estándar utiliza los mismos operadores que BASIC, mientras que muchas bases de datos permiten != además del <> del estándar. SQL sigue el álgebra de Boole estricta, es decir, no utiliza evaluación de cortocircuito, que es común a la mayoría de los lenguajes siguientes. Por ejemplo, PHP lo tiene, pero por lo demás dispone de estos mismos dos operadores definidos como alias, como muchas bases de datos SQL.

+ Operadores relacionales comunes Convención igual a no igual a mayor que menor que mayor queo igual a menor queo igual a Símbolo=≠><≥≤ FortranIncluyendo FORTRAN II, III, IV, 66 y 77. .EQ..NE..GT..LT..GE..LE.ALGOL 68ALGOL 68: se utilizan textos clave en el código de plataformas con conjuntos de caracteres limitados ("por ejemplo", usando >= o GE en lugar de ≥), plataformas sin énfasis de texto negrita (se usa 'ge') o plataformas solo con MAYÚSCULA (usando .GE o 'GE').=≠><≥≤/=>=<=eqnegtltgele APL=≠><≥≤ BASIC, ML, PascalIncluyendo ALGOL, Simula, Modula-2, Eiffel, SQL, hojas de cálculo, y otros.=<>Modula-2 también reconoce #><>=<= Lenguajes tipo CIncluyendo C, C++, C#, Go, Java, JavaScript, Perl (comparación numérica solamente), PHP, Python, Ruby, y R.==!=><>=<= MUMPS='=><'<'> Lua==~=><>=<=Erlang==/=><>==<=:==/= Shells del tipo BourneIncluyendo Bourne Shell, Bash, Korn shell, y PowerShell. Los símbolos < y > generalmente se usan en un shell para las redirecciones, por lo que se deben usar otros símbolos. Sin el guion, se utiliza en Perl para comparar cadenas.-eq-ne-gt-lt-ge-le Archivo batchEQUNEQGTRLSSGEQLEQMATLABMATLAB, aunque en otros aspectos usa una sintaxis similar a la de C, no usa !=, ya que ! en MATLAB envía el siguiente texto como una línea de comando al sistema operativo. La primera forma también se usa en Smalltalk, con la excepción de la igualdad, que es =.==~=><>=<=eq(x,y)ne(x,y)gt(x,y)lt(x,y)ge(x,y)le(x,y) Fortran,Incluyendo FORTRAN 95, 2003, 2008 y 2015. Haskell==/=><>=<=MathematicaRelational and Logical Operators de Mathematica==!=><>=<=Equal[x,y]Unequal[x,y]Greater[x,y]Less[x,y]GreaterEqual[x,y]LessEqual[x,y]

Otras convenciones son menos comunes: Common Lisp y Macsyma/Maxima usan operadores similares a los de BASIC excepto para la desigualdad, que es /= en Common Lisp y # en Macsyma/Maxima. Los Lisps anteriores usaban equal, greaterp y lessp; y las negaciones usando not para los operadores correspondientes.

Sintaxis Los operadores relacionales también se utilizan en la literatura técnica en lugar de palabras. Generalmente se escriben en notación de infijo si son compatibles con el lenguaje de programación, lo que significa que aparecen entre sus operandos (las dos expresiones están relacionadas). Por ejemplo, una expresión en Python imprimirá un mensaje si x es menor que y: if x < y: print("x es menor que y en este ejemplo")

Otros lenguajes de programación, como Lisp, utilizan la notación polaca de la siguiente manera: (>= X Y)

Operadores encadenados En matemáticas, es una práctica común encadenar operadores relacionales, como en 3 < x < y < 20 (es decir, 3 < x y x < y e y < 20). La sintaxis es clara, ya que estos operadores relacionales en matemáticas son transitivos.

Sin embargo, muchos lenguajes de programación recientes verían una expresión como 3 < x < y compuesta por dos operadores asociativos izquierdo (o derecho), interpretándola como algo así como (3 < x) < y. Si se considera que x=4, se obtiene (3 < 4) < y y la evaluación dará true < y, lo que generalmente no tiene sentido. Sin embargo, se compila en C/C++ y algunos otros lenguajes, lo que puede producir resultados sorprendentes (ya que aquí "verdadero" estaría representado por el número 1).