Operador condicional ?:

La forma general de un operador ternario es la siguiente:

expresión1? expresión2:expresión3

Como el primer operando - "expresión1" se puede utilizar cualquier expresión, el resultado de la cual es el valor del tipo bool. Si el resultado es true, entonces se ejecuta el operador asignado por el segundo operando, es decir, "expresión2".  

Si el primer operando es igual a false, entonces se ejecuta el tercer operando — "expresiónЗ". El segundo y el tercer operando, es decir, "expresión2" y "expresión3" tienen que retornar los valores del mismo tipo y no deben tener el tipo void. El resultado de ejecución del operador condicional es el resultado de la expresión2 o el de la expresión3, dependiendo del resultado de la expresión1.

//--- normalizamos la diferencia entre los precios de apertura y de cierre para el rango diario
double true_range = (High==Low)?0:(Close-Open)/(High-Low);

Esta entrada es equivalente a la siguiente

   double true_range;
   if(High==Low)true_range=0;               // si High y Low son iguales
   else true_range=(Close-Open)/(High-Low); // si el rango no es cero

 

Limitaciones en el uso del operador #

A base del valor "expresión1" el operador tiene que devolver uno de dos valores - "expresión2" o "expresión3". Existe una serie de limitaciones para estas expresiones:

  1. No se puede confundir el tipo definido por el usuario con el tipo simple o enumeración. Para el puntero se puede utilizar NULL.
  2. Si los tipos de los valores son simples, entonces el tipo del operador será el tipo máximo (véase Conversión de tipos).
  3. Si uno de los valores tiene el tipo de enumeración y el segundo es del tipo numérico, la enumeración se reemplace con int y se aplica la segunda regla.
  4. Si los dos valores son valores de enumeración, entonces sus tipos tienen que ser iguales, y el tipo del operador será la enumeración.

Limitaciones para los tipos definidos por el usuario (clases o estructuras):

  1. los tipos tienen que ser idénticos o uno debe heredarse del otro.
  2. si los tipos no son idénticos (la herencia), entonces el hijo se convierte al padre de forma implícita, es decir el tipo del operador va a ser del tipo del padre.
  3. no se puede confundir el objeto y el puntero - o las dos expresiones son objetos, o bien los punteros. Se puede usar NULL para el puntero.

Nota

Tenga cuidado a la hora de usar el operador condicional como un argumento de la función sobrecargada, porque el tipo del resultado del operador condicional se determina en el momento de compilación del programa. Y este tipo se determina como el más grande de los tipos "expresión2" y "expresión3".

Ejemplo:

void func(double d) { Print("double argument: ",d); }
void func(string s) { Print("string argument: ",s); }
 
bool   Expression1=true;
double Expression2=M_PI;
string Expression3="3.1415926";
 
void OnStart()
  {
   func(Expression2);
   func(Expression3);
 
   func(Expression1?Expression2:Expression3);   // recibimos un aviso del compilador sobre la conversión explícita al tipo string
   func(!Expression1?Expression2:Expression3);  // recibimos un aviso del compilador sobre la conversión explícita al tipo string
  }
 
//   Resultado:
//   double argument: 3.141592653589793
//   string argument: 3.1415926
//   string argument: 3.141592653589793
//   string argument: 3.1415926

Véase también

Inicialización de variables, Visibilidad y tiempo de vida de variables, Creación y eliminación de objetos