Operador Ternario ?: (operador condicional)

Publicado el Martes, 13 de octubre de 2009

El operador ternario ?: en programación es una forma de hacer operaciones condicionales con 3 parámetros. La forma básica de aplicarlo es la siguiente:

expresión1 ? expresión2 : expresión3

Se evalúa la expresión1, y si su resultado es verdadero, entonces se evalúa y devuelve como resultado la expresión2. Si expresión1 es falso, se evalúa y devuelve expresión3. En este caso, es equivalente a escribir:

if (expresión1) {
    expresión2;
} else {
    expresión3;
}

Otra forma de interpretar el orden de los factores sería:

condición ? valor_si_es_verdadero : valor_si_es_falso

Generalmente es bastante cómodo usarlo para asignarle un valor a una variable según el valor booleano de otra. Esto se podría escribir así (PHP):

if ($haceFrio) {
    $variable = "Hace frío";
} else {
    $variable = "No hace frío";
}

Pero con el operador ternario quedaría en una sola línea así:

$variable = ($haceFrio) ? "Hace frío" : "No hace frío";

También se puede resumir, en algunos lenguajes, omitiendo el valor del medio. De esta forma expresión1 ? : expresión3 retorna expresión1 si es Verdadero, y expresión3 de otra forma.

Al principio me resultaba un poco confuso, pero al entenderlo es bastante simple. Ahorra algo de tiempo y líneas a la hora de escribir código. Y al tener claro el concepto, es bastante simple identificarlo y entender el código. Espero que sirva de referencia para empezar a usarlo 😀

Existe en Ruby, PHP, Python, Java, C y C++, cada uno con su sintaxis. (Si saben de algún otro lenguaje que lo implemente, avisen en los comentarios y lo agrego).

Hace poco tiempo aprendí a programar con este operador. Se lo debo a Grilix, que me enseñó a usarlo después de que lo viera varias veces en su código PHP, siempre seguido de un WTF? por mi parte. Aprovechando el hecho de haber aprendido algo nuevo, lo comparto por acá.

32 comentarios en este post

Feed de comentarios
  1. Avatar

    alvaro 13 octubre. 2009 - 06:05

    Ruby y Perl también tienen operador ternario.
    Supongo que a los derivados .NET no les faltará, seguramente casi todos los lenguajes lo tengan jeje (aunque no por ello es meno útil!!).

    Un saludo.

  2. Avatar

    Bruno 13 octubre. 2009 - 08:56

    No se si se puede llamar operador ternario pero en Smalltalk quedaria algo asi:

    variable := haceFrio ifTrue: ['hace frio'] ifFalse: ['no hace frio']
     
    "Tambien se puede escribir como:"
    trueBlock := ['hace frio']
    falseBlock := ['no hace frio']
    variable := haceFrio ifTrue: trueBlock ifFalse: falseBlock

    Donde #ifTrue:ifFalse: es un MENSAJE el objeto que es una subinstancia de Boolean (True o False). y son dos instancias de BlockClosure (“un bloque de codigo”).

    No se si cuenta como ternario…
    Saludos,
    Bruno

  3. Avatar

    Gonzalo Arreche 13 octubre. 2009 - 15:46

    En perl existe algo mas divertido también:

    function boolToStr($b) {
      return $b ? 'Si' : 'No';
    }
    $a = 'Hace frío: ' . boolToStr($haceFrio);

    Aunque esto se puede hacer en PHP:

    function boolToStr($b) {
      return $b ? 'Si' : 'No';
    }
    $a = 'Hace frío: ' . boolToStr($haceFrio);

    O también podrias (payando a partir de este punto)…

    function boolToStr($b) {
      return $b ? 'Si' : 'No';
    }
    $a = 'Hace frío: ' . boolToStr($haceFrio);

    Y ni quiero ponerme a pensar en tokens.. jaja 😛

  4. Avatar

    andres 13 octubre. 2009 - 15:51

    Ese operador lo tienen practicamente todos los lenguajes.

    El que da el ejemplo de ruby… esa funcionalidad no solo la tiene ruby, sino que hay varios lenguajes funcionales que lo implementan. Igualmente esa funcionalidad depende mas de como el lenguaje implementa la comparacion (devolviendo la referencia del primer elemento q de true), este tipo de cosas se puede hacer principalmente en lenguajes totalmente dinámicos, funcionales, etc, mas q en lenguajes tipo php, c#, java….

    Saludos!

  5. Avatar

    Andrés Tarallo 21 octubre. 2009 - 13:22

    Al menos en C se recomendaba utilizarlo con cuidado. Era facil construir expresiones donde no quedara claro, a primera vista, el resultado de la expresion.

  6. Avatar

    miguel angel 6 abril. 2016 - 15:27

    en tu post dices que puedes omitir el valor del centro,
    “también se puede resumir, en algunos lenguajes, omitiendo el valor del medio. De esta forma expresión1 ? : expresión3 retorna expresión1 si es Verdadero, y expresión3 de otra forma.”
    en ese caso donde se evalua la expresion?

  7. Avatar

    mermelado 25 julio. 2016 - 17:04

    Hola a todos:
    A mi me falla si en verdadero pongo varias instrucciones separadas con ;
    php da error, sin embargo en false admite varias instrucciones separadas por ;

    ¿Raro no?

  8. Avatar

    TheFlash 28 diciembre. 2016 - 16:57

    Aunque el artículo es de 2009, escribo este comentario porque me ha resultado de bastante ayuda. Llevaba viendo este operador desde hace tiempo en un montón de libros y no tenia ni idea para que servía, la verdad es que es bastante más económico a la hora de escribir código que usar las sentencias condicionales.

  9. Avatar

    LeonardoCM 18 abril. 2017 - 13:16

    Excelente artículo publicado antes de que aprendiera a programar jajaja… Me gusta mucho usar este operador en PHP saludos!

  10. Avatar

    ivan mrsnik 14 abril. 2018 - 19:50

    Porque estas 2 lineas casi iguales presentan en el echo datos diferentes

    echo true ? $a='a1': $a='a2' ?'b':3?'d':'e'; // devuelve el echo a1
    echo true ? $a='a1': $a='a2' ?'b':3?'d':'e'; // devuelve el echo a1

    La unica diferencia el primero no asigna valor, en la segunda asigna el valor

  1. HAML – Atributo condicional en etiqueta HTML | Picando Código | 4 julio. 2013 - 09:01

    […] usa el operador ternario. Si la condición da verdadera, se agrega el atributo class="active" a la etiqueta tr, en caso […]

  2. Intrigado con Scala – parte 1 | Picando Código | 16 octubre. 2013 - 10:30

    […] ese mismo ejemplo usa el operador ternario que no está disponible en Scala. Esto es porque el if no es una sentencia, es una expresión que […]

  3. Validación básica en Rails 4 – mensajes en formulario | AFelipe - Blog | 23 junio. 2014 - 23:06

    […] una expresión ternaria para comprobar si el atributo tiene un […]

Dejar un comentario

Toasty!