Mi nombre es Fernando Briano y soy programador.

Operador Ternario ?: (operador condicional)

Tengo que confesar algo… hace muy poco tiempo que 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, les comento sobre el operador ternario:

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 ? valorSiEsVerdadero : valorSiEsFalso

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í:

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 así como 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 haya alguien más que no conociera sobre este operador y le sirva de referencia para empezar a usarlo 😀

Existe en 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).

Feed de comentarios | Url para Trackbacks | Suscribirse a los posts por correo electrónico

28 comentarios en este post

  1. Avatar johnboyd 13 Octubre. 2009 - 5:22 am Shiretoko 3.5.3 GNU/Linux

    una vez más ruby demuestra por qué es el mejor de todos
    http://invisibleblocks.wordpress.com/2007/06/11/rubys-other-ternary-operator/

  2. Avatar alvaro 13 Octubre. 2009 - 6:05 am Google Chrome 4.0.222.5 GNU/Linux

    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.

  3. Avatar Bruno 13 Octubre. 2009 - 8:56 am Internet Explorer 7.0 Windows XP

    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

  4. Avatar Bleach 13 Octubre. 2009 - 11:18 am Firefox 3.5.3 Windows XP

    También lo tiene C#

  5. Avatar Arlequín 13 Octubre. 2009 - 11:58 am Firefox 3.5.3 Windows NT

    Está bueno ese operador. Yo lo conocí cuando aprendí C y le llamábamos “asignación condicional”.

  6. Avatar Gonzalo Arreche 13 Octubre. 2009 - 3:46 pm Google Chrome 4.0.213.1 GNU/Linux

    En perl existe algo mas divertido también:

    $a = 'Hace frío' if $haceFrio;

    Aunque esto se puede hacer en PHP:

    $haceFrio && $a = 'Hace frío';

    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 😛

  7. Avatar andres 13 Octubre. 2009 - 3:51 pm Firefox 3.0.14 Windows XP

    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!

  8. Avatar Gonzalo Arreche 13 Octubre. 2009 - 4:12 pm Google Chrome 4.0.213.1 GNU/Linux

    Creo que a pesar de que es un operador bastánte poco complejo, se merece un BIEN ENCARADO !, al haber aprendido esto :P.. enhorabuena !! jajaja

  9. Avatar Dark Musician 13 Octubre. 2009 - 5:13 pm Firefox 3.0.14 Ubuntu

    Sí, casi todos los lenguajes tienen eso.

  10. Avatar Alejandro Segovia 13 Octubre. 2009 - 10:05 pm Firefox 3.5.3 Mac OS

    En Python también se puede hacer, pero con una sintaxis bastante distinta:

    variable = hace_frio and “Hace Frio” or “No Hace Frio”

    Saludos!

  11. Avatar hugo_dc 14 Octubre. 2009 - 1:50 am Debian IceWeasel 3.0.6 Debian GNU/Linux

    Yo aprendí a usarlo en JavaBat 🙂

    http://clinuxera.org/hugo-dc/?p=71

  12. Avatar HacKreatorz 14 Octubre. 2009 - 3:46 am Firefox 3.5.3 Windows XP

    Los programas que hago en VisualBasic.NET y en Gambas están llenas de este operador ya que lo puedo usar para muchísimas excepciones que pongo en el código.

  13. Avatar reasons 16 Octubre. 2009 - 9:28 am Firefox 3.0.14 Windows XP

    ActionScript también lo tiene (al menos desde la versión 2.0)

  14. Avatar Andrés Tarallo 21 Octubre. 2009 - 1:22 pm Firefox 3.5.3 Windows XP

    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.

  15. Avatar Christian Cisneros 27 Enero. 2013 - 2:45 am Firefox 18.0 GNU/Linux 64 bits

    Muchas buena informacion! Gracias!

  16. Avatar Luis 11 Marzo. 2013 - 11:31 am Internet Explorer 10.0 Windows 7

    Excelente!

  17. Avatar charlie 25 Julio. 2014 - 3:38 pm Google Chrome 36.0.1985.125 Windows 7

    esta igual en ActionScript3.0
    justo lo acabo de agregar en el trabajo
    aki esta la linea.
    sprite.alpha = (visibilidad)?0 : 1;

  18. Avatar GAbi 14 Octubre. 2015 - 3:07 pm Firefox 41.0 Ubuntu 64 bits

    En javascript también se usa!

  19. Avatar miguel angel 6 Abril. 2016 - 3:27 pm Google Chrome 49.0.2623.110 Windows NT

    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?

  20. Avatar mermelado 25 Julio. 2016 - 5:04 pm Google Chrome 49.0.2623.112 Windows XP

    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?

  21. Avatar TheFlash 28 Diciembre. 2016 - 4:57 pm Google Chrome 55.0.2883.87 Windows NT

    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.

  22. Avatar Yerlin Matu 9 Marzo. 2017 - 12:25 pm Google Chrome 56.0.2924.87 Windows 8

    JavaScript también lo utiliza.
    ¡Saludos!

  23. Avatar LeonardoCM 18 Abril. 2017 - 1:16 pm Google Chrome 57.0.2987.133 Windows 7

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

  1. WordPress HAML – Atributo condicional en etiqueta HTML | Picando Código | 4 Julio. 2013 - 9:01 am

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

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

    […] 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. Unknown Validación básica en Rails 4 – mensajes en formulario | AFelipe - Blog | 23 Junio. 2014 - 11:06 pm

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

Dejar un comentario

Toasty!