Disponible la nueva versión "donationware" 7.3 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


4.9.12  Operadores relacionales

§1  Sinopsis

Los operadores relacionales, también denominados operadores binarios lógicos y de comparación, se utilizan para comprobar la veracidad o falsedad de determinadas propuestas de relación (en realidad se trata respuestas a preguntas). Las expresiones que los contienen se denominan expresiones relacionales. Aceptan diversos tipos de argumentos, y el resultado, que es la respuesta a la pregunta, es siempre del tipo cierto/falso, es decir, producen un resultado booleano ( 3.2.1b)

Si la propuesta es cierta, el resultado es true (un valor distinto de cero), si es falsa false (cero). C++ dispone de los siguientes:

<      Menor que

>      Mayor que

<=    Menor o igual que

>=    Mayor o igual que

==    Igual que  (identidad)

!=     Desigual que (desigualdad)

§2  Sintaxis

expresión-relacional  <   shift-expresion

expresión-relacional  >   shift-expresion

expresión-relacional  <=  shift-expresion

expresión-relacional  >=  shift-expresion

expresión-de-igualdad == expresión-relacional

expresión-de-igualdad != expresión-relacional

§3  Comentario

Como puede verse, todos ellos son operadores binarios (utilizan dos operandos), de los cuales, dos de ellos son de igualdad: == y !=, y sirven para verificar la igualdad o desigualdad entre valores aritméticos o punteros.  Estos dos operadores pueden comparar ciertos tipos de punteros, mientras que el resto de los operadores relacionales no pueden utilizarse con ellos.

Observe que los operadores == y != tienen una menor precedencia ( 4.9.0a) que el resto de los operadores relacionales < y >, <= y >=.

El operador de desigualdad != tiene otra forma estándar de designación mediante la palabra clave not_eq ( 4.9.8)


§3.1 
Cualquiera que sea el tipo de los operandos, por definición, un operador relacional, produce un bool (true o false) como resultado, aunque en determinadas circunstancias puede producirse una conversión automática de tipo a valores int (1 si la expresión es cierta y 0 si es falsa).

Ejemplo de comprobación:

#include <iostream.h>

int main() {
  float f = 12.1, g = 12.2;
  cout << "Tipo: " << typeid(f < g).name() << endl;
}

Salida

Tipo: bool

§4  Condiciones

En las expresiones relacionales E1 <operador> E2, los operandos deben cumplir alguna de las condiciones siguientes:

  1. E1 y E2 son tipos aritméticos.
  2. E1 y E2 son punteros a versiones cualificadas o no cualificadas de tipos compatibles.
  3. Uno de ellos es un puntero a un objeto, mientras que el otro es un puntero a una versión cualificada o no cualificada de void.
  4. Uno de los dos es un puntero, mientras que el otro es un puntero nulo constante.


  Cuando se trata de tipos definidos por el usuario (que no cumplen las condiciones anteriores) estos operadores pueden ser sobrecargados de forma que puedan ser utilizados con dichos tipos ( 4.9.18b1).

§5    Precauciónes !!
§5.1  Con el operador de igualdad

Las expresiones relacionales de igualdad son frecuentísimas en la programación. En multitud de ocasiones se comparan dos expresiones y se toma una decisión en función del resultado cierto / falso obtenido. Por ejemplo, la condición de la sentencia de iteración while ( 4.10.3) puede ser una expresión relacional de igualdad:

int x = 1; y = 2;
...
while (x == y ) {
  cout << "Son iguales..." << endl;
  ...
}

Es muy frecuente que, tanto el principiante, como el programador acostumbrado a otros lenguajes, donde el operador de asignación y el de igualdad son distintos a los utilizados en C++ (por ejemplo := y =), confundan el operador de igualdad == con el de asignación =. Es este caso, el código anterior sería escrito erróneamente:

while (x = y ) {
  cout << "Son iguales..." << endl;
  ...
}

El resultado es que el bucle se ejecuta mientras sea y != 0, ya que la expresión asigna y a x, y el resultado es cierto mientras que x sea distinto de cero.

Algunos compiladores son suficientemente "inteligentes" como para advertir del posible error, pero otros aceptan que se pretende una asignación. Por ejemplo, en el caso anterior, el compilador Borland C++ 5.5 produce una advertencia:

Possibly incorrect assignment in function....

En cambio Visual C++ 6.0 de MS acepta la propuesta sin rechistar.

§5.2  Con los operadores compuestos

Es frecuente alterar el orden de los operadores compuestos. Recuerde que el signo "=" va a la derecha !!

Ejemplo:

int n = 10;
for (i = 0 ; i =< n ; i++) { /* ejecutar este bucle */ }   // Error !!
for (i = 0 ; i <= n ; i++) { /* ejecutar este bucle */ }   // Ok.