Portada arrow Artículos arrow El operador ternario
El operador ternario
sábado, 05 de mayo de 2007
operador ternarioEn muchos lenguajes de programación existe una curiosa construcción conocida comunmente como el operador ternario. Sin duda, su utilización puede dotar al código en muchas ocasiones de gran claridad, facilitar el trabajo a los programadores y lograr excelentes optimizaciones por parte de los compiladores.

Esta construcción se permite en muchos de los lenguajes de programación modernos y muchos otros bastante menos modernos. En su día la instrumentó el lenguaje C, y casi todos los lenguajes que han derivado de él la han heredado (C++, C#, Java, PHP...) Aunque muchos otros lenguajes no disponen de ella, que yo sepa... por ejemplo, todos los derivados de Pascal (Delphi, Modula, Oberon...). No es ni mucho menos una construcción imprescible, aunque suele venir muy bien. (Por cierto, parece que el primero en implementarla no fue el C, sino el Algol External link)

 

Se le suele denominar operador ternario porque es el único operador aritmético-lógico del que disponen los lenguajes de programación que necesita tres argumentos para realizar su trabajo. En C y sus derivados existen varios operadores binarios (que toman dos argumentos), y algunos menos unarios (que toman un solo argumento).

Por ejemplo, el operador "*" para multiplicar dos argumentos: a*b → devuelve a multiplicado por b , o el operador "%", que obtiene el resto de la división entera: 46%3 → devuelve el resto de dividir 46 entre 3. El operador "-" colocado delante de un entero devuelve ese entero cambiado de signo.... es un operador unario: -a.

 

Pues bien, el operador ternario toma tres operandos. Despues del primer operando se coloca el símbolo "?", y entre el segundo y el tercero el símbolo ":". Es decir, toma la forma

a?b:c

El primer operando (a) debe ser una expresión que se evalúe a un valor booleano. El segundo y el tercero pueden ser de cualquier tipo, pero la mayoría de los lenguajes exigen que sean del mismo tipo.

 

Cuando escribimos una expresión de ese estilo, el compilador o intérprete evalúan el primer operando (a), y si es verdadero, el resultado de toda la expresión es el valor del segundo operando (b), y en caso de ser falso, el resultado de toda la expresión es el tercer operando (c).

 

Bueno, bien... ¿Y para qué vale?.... pues veamos algunos ejemplos:

En este trozo de código, asignaremos valor a una variable dependiendo de una condición:

 
if (z>9)
  {
  k=3;
  }
else
  {
  k=8+z;  
  }
 

Pero podía haberse escrito utilizando el operador ternario de ésta forma:

 
k=(z>9)?3:(8+z);
 

Otro ejemplo, dependiendo de una condición queremos imprimir una frase u otra:

 
if (k==12)
   {
   Console.WriteLine("La variable k tiene un valor igual a 12");
   }
else
   {
   Console.WriteLine("La variable k tiene un valor distinto de 12");
   }
 

Nuevamente, podríamos haber utilizado el operador ternario, por ejemplo:

 
Console.WriteLine("La variable k tiene un valor "
        +(k==12)?"igual a":"distinto de"
        +" 12");
 

Devolviendo un valor de retorno en un método o función

 
if (j>=45)
  {
  z=a+3;
  }
else
  {
  z=a-30;
  }
return z;
 

Podríamos sustituirlo por

 
z=(j>=45)?(a+3):(a-30);
return z;
 

O incluso por

 
return ((j>=45)?(a+3):(a-30));
 

 

En fin... Los usos de éste operador son muy variados, y como se puede apreciar, en muchas ocasiones simplifica bastante en código. Aunque en ésto, como en todo, hay opiniones para todos los gustos.

En cuanto a la eficiencia, se debe destacar que en muchas ocasiones, los compiladores son capaces de crear código bastante optimizado cuando se lo encuentran.

Quizá estés pensando que el funcionamiento del operador ternario se podría emular con una función o un método que aceptase tres parámetros: uno booleano y otros dos del mismo tipo. Sí... en efecto es así, pero con salvedades. Algunos lenguajes ya disponen de ese método... pero no es lo mismo que utilizar un operador. Se nos plantean un par de problemas: en primer lugar, ¿Qué tipo deberíamos poner para el segundo y tercer parámetro?, y en segundo lugar, un método o función siempre implican trasiego a través de la pila, cosa que el operador ahorra.

En definitiva, si tu lenguaje dispone del operador ternario y te gusta, úsalo. Si no te gusta o no disponemos de él, siempre podemos utilizar un if.

 
←Artículo anterior   Artículo siguiente→

Categorías

  • Ingeniería del software  ( 3 artículos )

    Acerca de la ingeniería del software y el ciclo de vida del software.

  • El programador elegante  ( 12 artículos )
    Una serie de artículos dedicados a buenas prácticas en programación
  • Opinión  ( 7 artículos )

    Artículos de opinión, no necesariamente fundamentada.

  • Básico  ( 12 artículos )

    Artículos básicos sobre temas básicos.

     

Artículos relacionados

No se encontraron artículos relacionados

Suscríbete

RSS feed Sindicación RSS

(¿Qué es la sindicación RSS?)


Suscribir por e-mail

¿Dónde estoy?

Estás en La tecla de ESCAPE, un sitio web personal en el que nos gusta hablar de algoritmos, informática, tecnología, ciencia, ingeniería, internet... y cualquier tontería que se nos ocurra. El punto de vista de nuestros artículos técnicos suele ser muy básico, así que a menudo adoptamos grandes simplificaciones. (Más...-Términos de uso)