Articulo de referencia

operador condicional ternario

En programación informática , el operador condicional ternario es una expresión condicional con tres partes: la condición booleana , la expresión ` then` y la expresión `else` ....

En programación informática , el operador condicional ternario es una expresión condicional con tres partes: la condición booleana , la expresión ` then` y la expresión `else` . Si la condición es verdadera, se evalúa la expresión `then` ; de lo contrario, se evalúa la expresión `else` y se devuelve el valor. Por lo tanto, es un operador no estricto , como otras expresiones condicionales. También se le conoce como operador condicional , `if ternario` , `if inmediato` o ` if en línea` ( iif ).

Si bien un operador ternario es, en general, cualquier operador con tres argumentos, el operador condicional de tres argumentos es el único común en programación, por lo que se le denomina informalmente operador ternario.

C introdujo la sintaxis a ? b : c, que se lee como "si a entonces b de lo contrario c", que es ampliamente utilizada por otros lenguajes con sintaxis similar a C. Algunos lenguajes utilizan sintaxis funcional: en Visual Basic , se escribe If(a, b, c).

Muchos lenguajes admiten expresiones condicionales con dos, tres o más cláusulas. Los lenguajes que siguen una sintaxis similar a ALGOL a menudo las admiten con la misma sintaxis que las sentencias condicionales , if a then b else c.

El constructo apareció por primera vez en CPL en 1963, como a → b, c. [ 1 ] [ 2 ]

Patrones

Asignación

El valor del operador se puede asignar a una variable. En un lenguaje de tipado débil, el tipo de dato del valor seleccionado puede determinar el tipo del valor asignado. En un lenguaje de tipado fuerte, ambas expresiones de valor deben evaluarse a un tipo compatible con la variable de destino.

Este operador es similar a la forma en que funcionan las expresiones condicionales (if-then-else) en lenguajes de programación funcional , como Scheme , ML , Haskell y XQuery , ya que if-then-else forma una expresión en lugar de una instrucción en esos lenguajes.

Este operador permite inicializar una variable mediante una sola instrucción, lo que de otro modo requeriría varias. Su uso en la asignación de variables reduce la probabilidad de errores derivados de una asignación incorrecta, ya que la variable asignada se especifica solo una vez.

Por ejemplo, en Python:

x : str = 'foo' si b sino 'bar'

en lugar de:

x : cadena si b : x = 'foo' sino : x = 'bar'

En un lenguaje con ámbito de bloque , una variable debe declararse antes de la instrucción if-else. Por ejemplo:

std :: string s ; if ( b ) { s = "foo" ; } else { s = "bar" ; }

El uso del operador condicional simplifica esto:

std :: string s = b ? "foo" : "bar" ;

Además, dado que la inicialización ahora forma parte de la declaración, en lugar de ser una instrucción separada, el identificador puede ser una constante. Por ejemplo:

const std :: string s = b ? "foo" : "bar" ;

Selector de cajas

El operador condicional se puede utilizar para selectores de casos. Por ejemplo:

vehículo = arg == 'B' ? autobús : arg == 'A' ? avión : arg == 'T' ? tren : arg == 'C' ? coche : arg == 'H' ? caballo : pies ;

Variaciones

La sintaxis y la semántica del operador varían según el idioma.

Las principales diferencias radican en si las expresiones pueden tener efectos secundarios y si el lenguaje proporciona una semántica de evaluación de cortocircuito , mediante la cual solo se evalúa la expresión seleccionada.

Si un lenguaje admite expresiones con efectos secundarios pero no especifica la evaluación en cortocircuito, entonces existe una distinción adicional sobre qué expresión se evalúa primero. Si no se garantiza un orden, existe una distinción sobre si el resultado se clasifica como indeterminado (el valor obtenido de algún orden) o indefinido (cualquier valor a discreción del compilador ante efectos secundarios, o incluso un fallo del sistema).

Si un lenguaje no permite efectos secundarios en las expresiones (algo común en los lenguajes funcionales), entonces el orden de evaluación no tiene semántica de valor, aunque puede influir en si una recursión infinita termina o tener otras implicaciones de rendimiento (en un lenguaje funcional con expresiones de coincidencia, la evaluación de cortocircuito es inherente y los usos naturales del operador ternario surgen con menos frecuencia, por lo que este punto es de poca importancia).

Por estas razones, en algunos idiomas la forma proposicional r = condition ? expr1 : expr2puede tener una semántica sutilmente diferente a la de la forma condicional en bloque . if(condition){r=expr1;}else{r=expr2;}

En casi todos los lenguajes, el operador ternario es asociativo por la derecha , por lo que a == 1 ? "one" : a == 2 ? "two" : "many"se evalúa intuitivamente como a == 1 ? "one" : (a == 2 ? "two" : "many"). Esto significa que se puede encadenar de forma similar a una if ... else if ... else if ... elsecadena. La principal excepción es PHP , en el que era asociativo por la izquierda (de modo que la misma expresión se evalúa como (a == 1 ? "one" : a == 2) ? "two" : "many", lo cual rara vez es lo que espera el programador) [ 3 ] antes de la versión 8, y es no asociativo a partir de entonces. [ 4 ]

Además, en todos los lenguajes de la familia C y en muchos otros, el operador condicional ternario tiene una baja precedencia de operador .

Ejemplos

Ada

La edición de 2012 de Ada introdujo expresiones condicionales (usando ify case), como parte de un conjunto ampliado de expresiones que incluía expresiones cuantificadas y funciones de expresión. El Fundamento de Ada 2012 [ 5 ] expone los motivos por los que Ada no las tenía antes, así como los motivos para añadirlas ahora, como por ejemplo para admitir "contratos" (también nuevo).

Pago_por_hora := ( si Día = Domingo entonces 12.50 sino 10.00 );

Cuando el valor de una expresión if es de tipo booleano, elsese puede omitir esa parte, siendo el valor True. Se pueden encadenar varias condiciones usando elsif.

ALGOL 60

ALGOL 60 introdujo las expresiones condicionales (condicionales ternarias) en los lenguajes de programación imperativos .

Esta declaración condicional:

entero hora_de_apertura ; si día = domingo entonces hora_de_apertura := 12 ; de lo contrario hora_de_apertura := 9 ;

Se puede reescribir con el operador condicional:

entero hora_de_apertura ; hora_de_apertura := si día = domingo entonces 12 sino 9 ;

ALGOL 68

Ambas cláusulas de elección de ALGOL 68 (cláusulas if y case) admiten lo siguiente:

Cláusula de elección única
if condition then statements [ else statements ] fio una versión breve:( condition | statements | statements )
Cláusula de elección encadenada
if condition1 then statements elif condition2 then statements [ else statements ] fio una forma breve: ( condition1 | statements |: condition2 | statements | statements ).

Intento

Existe un verdadero operador ternario para expresiones aritméticas:

(( resultado = condición ? valor_si_verdadero : valor_si_falso ))

Para las cadenas existen soluciones alternativas, como por ejemplo:

resultado = $(si condición ; entonces echo "valor_si_es_verdadero" ; de lo contrario echo "valor_si_es_falso" ; fi)

Donde conditionpuede ser cualquier comando bash. Si finaliza correctamente, se ejecuta el primer comando echo; de lo contrario, se ejecuta el segundo.

Familia C

El siguiente código en C asigna resultel valor de xif a > b, y en caso contrario el valor de y. Esta es la misma sintaxis que en muchos lenguajes relacionados, incluidos C++ , Java , JavaScript y Dart .

resultado = a > b ? x : y ;

Solo se evalúa la expresión seleccionada. En este ejemplo, xy yno requieren evaluación, pero pueden ser expresiones con efectos secundarios . Solo se producirá el efecto secundario para el valor de la expresión seleccionada. [ 6 ] [ 7 ]

Si xy yson del mismo tipo de datos, la expresión condicional generalmente tendrá ese tipo. De lo contrario, las reglas que rigen el tipo de datos resultante varían un poco entre lenguajes:

  • En C++, se realizan las conversiones de tipo aritméticas habituales para convertir xy ya un tipo común. Si ambos son tipos de puntero o referencia, o uno es un tipo de puntero y el otro es una expresión constante que se evalúa a 0, se realizan conversiones de puntero o referencia para convertirlos a un tipo común. [ 8 ]
  • En C#, si una expresión es implícitamente convertible al tipo de la otra, se utiliza ese tipo. De lo contrario, se produce un error de compilación. [ 9 ]
  • En los lenguajes de tipado dinámico, la expresión evaluada tiene el tipo de la expresión seleccionada.

Además, en C++, una expresión condicional puede usarse como un lvalue , si tanto xcomo yson lvalues, aunque esto rara vez se usa en la práctica: [ 10 ]

( foo ? bar : baz ) = frink ;

Lisp común

Asignación mediante una expresión condicional en Common Lisp :

( setq resultado ( si ( > a b ) x y ))

Forma alternativa:

( si ( > a b ) ( establecer resultado x ) ( establecer resultado y ))

dBASE

En dBase , la función condicional iif(<expL>, <expT>, <expF>)se llama "SI inmediato". Utiliza evaluación abreviada (solo evalúa una de <expT> o <expF> ).

Por ejemplo, para ordenar una lista por el nombre de la calle y luego (en la mayoría de los casos) el número de la casa, se podría escribir:

index on iif(instr(addr," ") , substr(addr,instr(addr," ")+1,10) + left(addr,instr(addr," ")-1) , addr)al archivo de índice 

En la línea de comandos de dBASE III, copie o exporte la tabla.

Fortran

Como parte del estándar Fortran-90, el operador ternario se agregó a Fortran como función intrínseca merge:

variable = fusionar ( x , y , a > b )

Tenga en cuenta que tanto x como y se evalúan antes de que la función devuelva los resultados de una u otra. En este caso, se devuelve x si la condición es verdadera y y en caso contrario.

Fortran-2023 añadió expresiones condicionales que evalúan una u otra de las expresiones en función de la expresión condicional:

variable = ( a > b ? x : y )

Kotlin

Kotlin no incluye el ?:operador ternario tradicional, sin embargo, se ifpuede usar como una expresión que se puede asignar, [ 11 ] logrando los mismos resultados.

val max = si ( a > b ) a sino b

Lua

Lua no tiene un operador condicional tradicional. Sin embargo, el comportamiento de cortocircuito de sus andoperadores orpermite emular este comportamiento. Lo siguiente es equivalente a: var = cond ? a : b.

var = cond y a o b

Esto tendrá éxito a menos aque sea lógicamente falso; en ese caso, la expresión siempre dará como resultado b. Esto puede provocar un comportamiento sorprendente si se ignora.

También existen otras variantes que se pueden utilizar, pero generalmente son más extensas:

var = ( { [ true ] = a , [ false ] = b } )[ not not cond ]

Luau, un dialecto de Lua, tiene expresiones ternarias que se parecen a las sentencias condicionales (if), pero a diferencia de estas, no tienen endpalabra clave y la elsecláusula es obligatoria. Opcionalmente, se pueden añadir elseifcláusulas. Está diseñado para reemplazar la construcción idiomática y se espera que funcione correctamente en todos los casos. [ 12 ]condandaorb

-- en Luau var = si cond entonces a sino b-- con cláusula elseif sign = if var < 0 then - 1 elseif var == 0 then 0 else 1

Extensiones de Object Pascal

Pascal fue a la vez una simplificación y una extensión de ALGOL 60, pero eliminó las expresiones condicionales.

RemObjects Oxygene añadió un operador ternario a Object Pascal aproximadamente en 2011, [ 13 ] y en 2025 Delphi hizo lo mismo. [ 14 ] Oxygene admite sentencias case/switch , esencialmente un if repetido, como expresiones que también se evalúan a un valor. [ 15 ]

Pitón

Python cuenta con una expresión condicional ternaria desde la versión 2.5 (septiembre de 2006). [ 16 ] El operador condicional de Python difiere del ?:operador de estilo C en el orden de sus operandos. La forma general es: [ 17 ]

resultado = x si a > b sino y

Esta forma invita a considerar xcomo valor normal y ycomo caso excepcional. A diferencia de las sentencias condicionales de Python, la elifcláusula no es compatible, pero se permiten expresiones condicionales anidadas.

Óxido

Como lenguaje de programación orientado a expresiones , todas las condicionales de Rust son expresiones, no sentencias, por lo que la sintaxis se comporta como el operador ternario al estilo C. Las versiones anteriores del lenguaje tenían un operador, pero se eliminó [ 18 ] debido a su duplicación con . [ 19 ]if expr1 else expr2?:?:if

Nótese la falta de punto y coma en el código siguiente en comparación con un bloque imperativo if... elsey el punto y coma al final de la asignación a y.

sea ​​x = 5 ;sea ​​y = si x == 5 { 10 } sino { 15 };

Esto también podría escribirse como:

sea ​​y = si x == 5 { 10 } sino { 15 };

Las llaves son obligatorias en las expresiones condicionales de Rust.

También podrías usar una matchexpresión:

let y = match x { 5 => 10 , _ => 15 , };

Charla informal

Cada expresión (mensaje enviado) tiene un valor. Por lo tanto, ifTrue:ifFalse:se puede utilizar:

|x y|x := 5. y := ( x == 5 ) si Verdadero: [ 10 ] si Falso: [ 15 ] .

SQL

La expresión SQL CASEes una generalización del operador ternario. En lugar de una condición y dos resultados, se pueden especificar n condiciones y n+1 resultados.

Con una condición, es equivalente (aunque más extenso) al operador ternario:

SELECCIONAR ( CASO CUANDO a > b ENTONCES x SINO y FIN ) COMO EJEMPLO_CONDICIONAL DE tab ;

Esto se puede ampliar a varias condiciones:

SELECCIONAR ( CASO CUANDO a > b ENTONCES x CUANDO a < b ENTONCES y SINO z FIN ) COMO EJEMPLO_CONDICIONAL DE tab ;

Visual Basic

Visual Basic proporciona una función condicional ternaria, IIf, como se muestra en el siguiente código:

Dim opening_time As Integer = IIf (( day = SUNDAY ), 12 , 9 )

Como función, los valores de los tres argumentos se evalúan antes de que se llame a la función. Para evitar evaluar la expresión que no se selecciona, Ifse agregó la palabra clave (en Visual Basic .Net 9.0) como un verdadero operador condicional ternario. Esto permite que el siguiente código evite una excepción si se implementara con IIfen su lugar:

Dim nombre As Cadena = Si ( persona Es Nada , "" , persona . Nombre )

Véase también

Referencias

  1. ^ Strachey, Christopher (2000). " Conceptos fundamentales en lenguajes de programación ". Higher-Order and Symbolic Computation . 13 ( 1–2 ): 11–49 . doi : 10.1023/A:1010000313106 . S2CID  14124601 .
  2. ^ "5.5 Expresiones condicionales". Manual de referencia de BCPL (PDF) . 1967. págs.  16–17 . Archivado del original (PDF) el 16 de marzo de 2016. Consultado el 15 de marzo de 2017 .
  3. ^ Wastl, Eric. "Asociatividad del operador ternario" . phpsadness.com . PHP Sadness . Consultado el 20 de septiembre de 2017 .
  4. ^ https://www.php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary
  5. ^ "Justificación de Ada 2012" . ACAA . Consultado el 10 de diciembre de 2015 .
  6. ^ ISO.IEC 9899:1999 (E) 6.5.15.4
  7. ^ Especificación de Java 7: 15.25 Operador condicional ? :
  8. ^ mikeblome. "Operador condicional: ?" . docs.microsoft.com . Consultado el 29/04/2019 .
  9. ^ BillWagner. "?: Operador - Referencia de C#" . docs.microsoft.com . Consultado el 29 de abril de 2019 .
  10. ^ "Operador condicional" . wiki.c2.com . Consultado el 29 de abril de 2019 .
  11. ^ "Expresión If de Kotlin Lang" . kotlinlang.org . Consultado el 25 de abril de 2021 .
  12. ^ "Sintaxis § Expresiones if-then-else" . Luau . Consultado el 7 de febrero de 2023 .
  13. ^ "expresiones if then (else)" . DelphiTools . Consultado el 11 de septiembre de 2025 .
  14. ^ "Próximamente en RAD Studio 13: Un operador ternario condicional para el lenguaje Delphi" . Embarcadero Blogs . 30 de julio de 2025. Consultado el 11 de septiembre de 2025 .
  15. ^ "Texas, ¡comiencen a usar sus fotocopiadoras!" . Blog de RemObjects . Consultado el 11 de septiembre de 2025 .
  16. ^ Propuesta de mejora de Python 308
  17. ^ "La referencia del lenguaje Python" .
  18. ^ "Eliminar operador ternario por pwoolcoc · Solicitud de extracción n.° 1705 · rust-lang/Rust" . GitHub .
  19. ^ "Eliminar operador ternario · Problema n.° 1698 · rust-lang/Rust" . GitHub .
  • Descripción del operador If en Visual Basic
  • Descripción de expresiones condicionales en Python (PEP 308)
  • Descripción en la especificación del lenguaje Java
  • Descripción en la documentación del lenguaje PHP
Obtenido de " https://en.wikipedia.org/w/index.php?title=Ternary_conditional_operator&oldid=1351872386 "