Namespaces
Variants

Comparison operators

From cppreference.net

Los operadores de comparación son operadores binarios que prueban una condición y devuelven 1 si esa condición es lógicamente true y 0 si esa condición es false .

Operador Nombre del operador Ejemplo Descripción
== igual a a == b a es igual a b
! = no igual a a ! = b a no es igual a b
< menor que a < b a es menor que b
> mayor que a > b a es mayor que b
<= menor o igual que a <= b a es menor o igual que b
>= mayor o igual que a >= b a es mayor o igual que b

Contenidos

Operadores relacionales

Las expresiones de operador relacional tienen la forma

lhs < rhs (1)
lhs > rhs (2)
lhs <= rhs (3)
lhs >= rhs (4)
1) expresión less-than
2) expresión mayor que
3) expresión menor o igual
4) expresión mayor o igual

donde

lhs , rhs - expresiones que tienen tipo real ambas o tipo puntero a objeto ambas

El tipo de cualquier expresión de operador relacional es int , y su valor (que no es un lvalue) es 1 cuando la relación especificada se cumple y 0 cuando la relación especificada no se cumple.

Si lhs y rhs son expresiones de cualquier tipo real , entonces

  • usual arithmetic conversions son realizadas
  • los valores de los operandos después de la conversión son comparados en el sentido matemático usual (excepto que los ceros positivos y negativos se comparan como iguales y cualquier comparación que involucre un valor NaN devuelve cero)

Tenga en cuenta que los números complejos e imaginarios no se pueden comparar con estos operadores.

Si lhs y rhs son expresiones de tipo puntero, ambos deben ser punteros a objetos de tipos compatibles , excepto que se ignoran las calificaciones de los objetos apuntados.

  • un puntero a un objeto que no es un elemento de un array se trata como si apuntara a un elemento de un array con un elemento
  • si dos punteros apuntan al mismo objeto, o ambos apuntan una posición después del final del mismo array, se comparan como iguales
  • si dos punteros apuntan a diferentes elementos del mismo array, el que apunta al elemento con el índice mayor se compara como mayor
  • si un puntero apunta a un elemento de un array y el otro puntero apunta una posición después del final del mismo array, el puntero que apunta una posición después del final se compara como mayor
  • si los dos punteros apuntan a miembros del mismo struct , el puntero al miembro declarado más tarde en la definición del struct se compara como mayor que el puntero al miembro declarado anteriormente
  • los punteros a miembros de la misma unión se comparan como iguales
  • todas las demás comparaciones de punteros invocan comportamiento indefinido
#include <assert.h>
int main(void)
{
    assert(1 < 2);
    assert(2+2 <= 4.0); // int convierte a double, dos 4.0 se comparan iguales
    struct { int x,y; } s;
    assert(&s.x < &s.y); // los miembros de struct se comparan en orden de declaración
    double d = 0.0/0.0; // NaN
    assert( !(d < d) );
    assert( !(d > d) );
    assert( !(d <= d) );
    assert( !(d >= d) );
    assert( !(d == d) );
    float f = 0.1; // f = 0.100000001490116119384765625
    double g = 0.1; // g = 0.1000000000000000055511151231257827021181583404541015625
    assert(f > g); // valores diferentes
}

Operadores de igualdad

Las expresiones del operador de igualdad tienen la forma

lhs == rhs (1)
lhs != rhs (2)
1) expresión equal-to
2) expresión de desigualdad

donde

lhs , rhs - expresiones que
(desde C23)
  • son ambos punteros a objetos o funciones de tipos compatibles , ignorando calificadores de los tipos apuntados
  • uno es un puntero a objeto y el otro es un puntero a void (posiblemente calificado)
  • uno es un puntero a objeto o función y el otro es una constante de puntero nulo como NULL o nullptr (desde C23)

El tipo de cualquier expresión de operador de igualdad es int , y su valor (que no es un lvalue) es 1 cuando la relación especificada se cumple y 0 cuando la relación especificada no se cumple.

  • si ambos operandos tienen tipos aritméticos, conversiones aritméticas usuales son realizadas y los valores resultantes son comparados en el sentido matemático usual (excepto que los ceros positivos y negativos se comparan iguales y cualquier comparación que involucre un valor NaN, incluyendo igualdad consigo mismo, retorna cero). En particular, los valores de tipo complejo son iguales si sus partes reales se comparan iguales y sus partes imaginarias se comparan iguales.
(desde C23)
  • si un operando es un puntero y el otro es una constante de puntero nulo, la constante de puntero nulo primero se convierte al tipo del puntero (lo que da un valor de puntero nulo), y los dos punteros se comparan como se describe a continuación
  • si un operando es un puntero y el otro es un puntero a void, el puntero no-void se convierte al puntero a void y los dos punteros se comparan como se describe a continuación
  • dos punteros comparan iguales si cualquiera de los siguientes es verdadero:
  • ambos son valores de puntero nulo de su tipo
  • ambos son punteros al mismo objeto o función
  • un puntero es a un objeto struct/union/array y el otro es a su primer miembro/cualquier miembro/primer elemento
  • ambos apuntan a una posición después del último elemento del mismo array
  • uno está después del final de un array, y el otro está al inicio de un array diferente (del mismo tipo) que sigue al primero en un array más grande o en un struct sin padding

(como con los operadores relacionales, los punteros a objetos que no son elementos de ningún array se comportan como punteros a elementos de arrays de tamaño 1)

Notas

Los objetos de tipo struct no se comparan iguales automáticamente, y compararlos con memcmp no es confiable porque los bytes de relleno pueden tener cualquier valor.

Debido a que la comparación de punteros funciona con punteros a void, la macro NULL puede definirse como ( void * ) 0 en C, aunque eso sería inválido en C++ donde los punteros void no se convierten implícitamente a punteros tipados

Se debe tener cuidado al comparar valores de punto flotante para igualdad, porque los resultados de muchas operaciones no pueden representarse exactamente y deben redondearse. En la práctica, los números de punto flotante usualmente se comparan permitiendo una diferencia de una o más unidades en el último lugar.

#include <assert.h>
int main(void)
{
    assert(2+2 == 4.0); // int se convierte a double, dos 4.0 se comparan iguales
    int n[2][3] = {1,2,3,4,5,6};
    int* p1 = &n[0][2]; // último elemento en la primera fila
    int* p2 = &n[1][0]; // inicio de la segunda fila
    assert(p1+1 == p2); // se comparan iguales
    double d = 0.0/0.0; // NaN
    assert( d != d ); // NaN no es igual a sí mismo
    float f = 0.1; // f = 0.100000001490116119384765625
    double g = 0.1; // g = 0.1000000000000000055511151231257827021181583404541015625
    assert(f != g); // valores diferentes
}

Referencias

  • Estándar C17 (ISO/IEC 9899:2018):
  • 6.5.8 Operadores relacionales (p: 68-69)
  • 6.5.9 Operadores de igualdad (p: 69-70)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 6.5.8 Operadores relacionales (p: 95-96)
  • 6.5.9 Operadores de igualdad (p: 96-97)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 6.5.8 Operadores relacionales (p: 85-86)
  • 6.5.9 Operadores de igualdad (p: 86-87)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 3.3.8 Operadores relacionales
  • 3.3.9 Operadores de igualdad

Véase también

Precedencia de operadores

Operadores comunes
asignación incremento
decremento
aritméticos lógicos comparación acceso a
miembros
otros

a = b
a + = b
a - = b
a * = b
a / = b
a % = b
a & = b
a | = b
a ^ = b
a <<= b
a >>= b

++ a
-- a
a ++
a --

+ a
- a
a + b
a - b
a * b
a / b
a % b
~a
a & b
a | b
a ^ b
a << b
a >> b

! a
a && b
a || b

a == b
a ! = b
a < b
a > b
a <= b
a >= b

a [ b ]
* a
& a
a - > b
a. b

a ( ... )
a, b
( type ) a
a ? b : c
sizeof


_Alignof
(desde C11)
(hasta C23)

alignof
(desde C23)

Documentación de C++ para Operadores de comparación