Operador ternario

Operador ternario

En informática un operador ternario (a veces incorrectamente llamado operador terciario) es un operador que toma tres argumentos. Los argumentos y el resultado puede ser de diferentes tipos. Originalmente proviene de BCPL, cuyo sintaxis equivalente para e1 ? e2: e3 era e1 -> e2, e3.[1] Idiomas derivado de BCPL tienden a aparecer con este operador.

Muchos lenguajes de programación que utilizan la sintaxis del lenguage C utilizan un operador ternario,?:, que define una sentencia condicional. Dado que este operador es a menudo el único operador ternario existente en el lenguage de programación, a veces es referido simplemente como "el operador ternario".

La mayoría de los lenguages de programación que se enfatizan en la programación funcional no necesitan dicho operador como su expresión regular condicional (s) es una expresión en primer lugar, por ejemplo, la expresión sistema (si (ab>) ab) es equivalente en la semántica de la expresión C (a> b)? a: b.

Este es también el caso en muchos lenguajes imperativos, empezando con ALGOL en el que sería posible escribir resultado := if a > b then a else b, también Smalltalk (resultado := (a > b) ifTrue: [ a ] ifFalse: [ b ]) o Ruby (resultado = if a > b: a else b end).

Contenido

Asignación condicional

La sintaxis del operador ternario (?:) se utiliza como sigue:[2]

expresión boleana ? valor si cierto : valor si falso

La condición es evaluada verdadera o falsa como una expresión booleana. Sobre la base de la evaluación de la condición de Booleana, la expresión entera devuelve valor si cierto si la condición es verdadera, pero valor si falso en caso de lo contrario. Por lo general, las dos sub-expresiones valor si cierto y valor si falso deben tener el mismo tipo, lo cual determina el tipo de toda la expresión. La importancia de este tipo de control se encuentra en el uso más común del operador --en declaraciones de asignación condicional. En este uso aparece como una expresión en el lado derecho de una sentencia de asignación, de la siguiente manera:

variable = condición ? valor si cierto : valor si falso

El operador ?: es similar a la manera como funcionan las expresiones condicionales (if-then-else) en lenguajes de programación funcional, como Scheme, ML y Haskell, puesto que if-then-else forma una expresión en lugar de una declaración en esos idiomas.

Uso

El uso más común de este operador ternario es hacer una breve sentencia condicional. Por ejemplo, si queremos desarrollar código en C para cambiar las horas de apertura de una tienda a 12:00 del medio dia los fines de semana y 9 en punto entre semana, podemos usar:

int tiempo_de_apertura = (día == FIN_DE_SEMANA) ? 12 : 9;

en lugar del codigo más detallado

int tiempo_de_apertura;
 
if (día == FIN_DE_SEMANA)
    tiempo_de_apertura = 12;
else
    tiempo_de_apertura = 9;

Las dos formas son casi equivalentes. Tenga en cuenta que el ?: es una expresión y if-then-else una declaración. Tambien hay que tomar en cuenta que ni el valor si es verdadero ni valor si falso pueden ser omitidos en el operador ternario, lo cual resultaría en un error por el compilador. Esto contrasta con sentencias de if..else, donde se puede omitir la cláusula else.

C++

En C++, hay situaciones donde el uso de asignación condicional de if-else no es posible, ya que esta lengua distingue explícitamente entre inicialización y asignación. En tal caso, siempre es posible utilizar una llamada a la función, pero esto puede ser incómodo y poco elegante. Por ejemplo, si desea pasar valores con condiciones diferentes como un argumento para un constructor de un campo o una clase base, no es posible utilizar un simple if-else, en este caso podemos usar una expresión de asignación condicional, o una llamada a la función. Hay que tomar en cuenta también que algunos tipos permiten la inicialización, pero no permiten la asignación, o incluso el operador de asignación hace cosas totalmente diferente a la del constructor. Esto último es válido para los tipos de referencia, por ejemplo:

#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
int main(int argc, char *argv[])
{
    string name;
    ofstream fout;
    if (argc > 1 && argv[1])
    {
        name = argv[1];
        fout.open(name.c_str(), ios::out | ios::app);
    }
 
    ostream &sout = name.empty() ? cout : fout;
}

En este caso no hay posibilidad de sustituir el uso del operador ?: con un if-else. (Aunque se puede sustituir el uso de ?: con una llamada a la función, dentro del cual puede ser un if-else.) Además, el operador ternario puede dar un Ivalue, es decir, un valor al cual otro valor se le puede asignar. Consideremos el siguiente ejemplo:

  #include <iostream>
   int main () {
   int a=0, b=0;
 
   const bool cond = ...;
   (cond ? a : b) = 1;
   std::cout << "a=" << a << ','
             << "b=" << b << '\n';
  }

CFML (Railo)

<cfscript>
arg = "T";
vehicle = ( ( arg == 'B' ) ? 'bus' : 
            ( arg == 'A' ) ? 'airplane' : 
            ( arg == 'T' ) ? 'train' : 
            ( arg == 'C' ) ? 'car' : 
            ( arg == 'H' ) ? 'horse' : 
                             'feet' );
</cfscript>
<cfoutput>#vehicle#</cfoutput>

Java, JSP

En Java el operador ternario es tambien referido como el operador condiconal y utiliza el mismo sintaxis que los demas lenguajes basados en el lenguage C. Por ejemplo, para verifcar que una persona es mayor de edad, utilizariamos lo siguiente:

   boolean mayor_de_edad = edad > 18 ? true: false;

Remplazaria el siguiente codigo detallado:

 boolean mayor_de_edad;
 if(edad > 18){
    mayor_de_edad = true;
 }else{
    mayor_de_edad = false;
 }

Para utilizar el operador ternario en JavaServer Pages, se puede incrustrar codigo de Java usando scriptlets. Esta manera no es recomendada, lo cual se sugiere usar bibliotecas de JSTL para obtener codigo mas limpio y estructurado. Por ejemplo, para alternar el color de las filas en una tabla de HTML usando CSS, pudieramos utilizar lo siguiente:

  <c:forEach list="${requestScope.miLista}" varStatus="contador"> 
      <tr class="${contador % 0 ? 'even' : 'odd'}">
         <td>Hola Mundo!!!/td>
      </tr>
  </c:forEach>

Perl, PHP

Un constructor tradicional de if-else en Perl o PHP se escribiría así:

if ($a > $b) {
    $result = $a;
} else {
    $result = $b;
}

Re-escrito con el operador ternario, se vería así:

$result = ($a > $b) ? $a : $b;

Desde la versión 5.3, PHP soporta una sintaxis del operador ternario. En esta forma, la condición es regresada a menos que la condición se evalúa como falsa:

 $variable = condicion ?: if false

Python

Aunque se habia demorado durante varios años por los desacuerdos sobre la sintaxis, un operador ternario para Python se aprobó como Python Enhancement Proposal 308 y se añadió a la versión 2.5 en septiembre de 2006. El operador ternario de Python difiere del común ?: en el orden de sus operandos. La forma general es:

valor_si_cierto if condición else valor_si_falso

Visual Basic .NET

A pesar de que .NET no utiliza los operandos ?: se puede usar una implementación muy similar a la sentencia if...else.

Dim tiempo_de_apertura As Integer = IIf((dia = FIN_DE_SEMANA), 12, 9)
 
'sintaxis general es IIf(condicion, valor_si_cierto, valor_si_falso)

En el ejemplo anterior, IIF es una función, y no un operador ternario real. Como función, los valores de las tres partes se evalúan antes de que se produzca llamada de la función. Esto impuso limitaciones y en Visual Basic. NET 9.0, lanzado como Visual Studio 2008, un operador ternario real fue introducido usando como clave IF en vez de IIF. Esto permite que el siguiente código funcione:

Dim nombre As String = If(persona Is Nothing, "", persona.Nombre)

Usando IIF, persona.Nombre se evaluaría incluso si el valor de persona es null (nulo), causando una excepción. Con un verdadero operador ternario de cortocircuito, persona.Nombre no se evalúa si el valor de persona no es nulo (not null).

Referencias

  1. «BCPL Ternary operator (page 15)». BCPL Reference Manual.
  2. «Ternary Operators». Kwista, LLC.. Consultado el 19-04-2010.

Enlaces externos


Wikimedia foundation. 2010.

Игры ⚽ Нужно решить контрольную?

Mira otros diccionarios:

  • Operadores de C y C++ — Esta es una lista de los grandes operadores de los lenguajes de programación C y C++. Todos los operadores listados existen en C++. La tercera columna indica si también están presentes en C. También hay que tener en cuenta que C no permite la… …   Wikipedia Español

  • Operación binaria — Se define como operación binaria aquella operación matemática, que necesita el operador y dos operandos (argumentos) para que se pueda calcular un valor. Por ejemplo, el operador de suma «+» es un operador binario, porque requiere dos argumentos …   Wikipedia Español

  • Operación unaria — Se define como operación unaria aquella operación matemática, que sólo necesita el operador y un único operando (argumento) para que se pueda calcular un valor. Por ejemplo, la función valor absoluto «| |» es un operador unario, porque sólo… …   Wikipedia Español

  • Álgebra mediana — En matemática, un álgebra mediana es un conjunto con un operador ternario < x,y,z > que satisface los siguientes axiomas, los cuales generalizan la noción de mediana o función mayorante, como una función booleana: Absorción por la derecha:… …   Wikipedia Español

  • Función mayorante — En lógica binaria, la función mayorante u operador mediano es una función matemática que va desde n entradas a una salida. El valor de la operación es falso cuando n/2 o más argumentos son falsos, y verdadera en otro caso. Alternativamente, sean… …   Wikipedia Español

  • Coín — Para otros usos de este término, véase Coín (desambiguación). Coín Bandera …   Wikipedia Español

  • Null (SQL) — Null (nulo) es un marcador especial usado en el lenguaje de consulta estructurado (SQL) para indicar que no existe un valor dentro de una base de datos. Introducido por el creador del modelo relacional de bases de datos E. F. Codd, su función es… …   Wikipedia Español

Compartir el artículo y extractos

Link directo
Do a right-click on the link above
and select “Copy Link”