Operador Ternário ?

A forma geral do operador ternário é a seguinte:

expressão? expressão: expressão3

Para o primeiro operando - "expressão1" - qualquer expressão que resulte em um valor do tipo bool pode ser usado. Se o resultado é true, então o operador definido pelo segundo operando, isto é, "expressão2", é executado.

Se o primeiro operando é false, o terceiro operando - "expressão3" é executado. Os segundo e terceiro operandos, isto é, "expressão2" e "expressão3" devem retornar valores de algum tipo e não devem ser do tipo void. O resultado da execução do operador condicional é o resultado de expressão2 ou o resultado de expressão3, dependendo do resultado de expressão1.

//--- diferença normalizada entre preços de abertura e fechamento para intervalo de um dia
double true_range = (High==Low)?0:(Close-Open)/(High-Low);

Esta entrada é equivalente ao seguinte:

   double true_range;
   if(High==Low)true_range=0;               // se o Máximo e o Mínimo são iguais
   else true_range=(Close-Open)/(High-Low); // se a faixa não é nula

 

Restrições ao Uso do Operador #

Baseado no valor da "expressão1", o operador deve retornar um dentre dois valores - ou "expressão2" ou "expressão3". Existem várias limitações nessas expressões:

  1. Não confunda o tipo user-defined (definida pelo usuário) com o tipo simples ou enumerador. NULL pode ser usado para ponteiro.
  2. Se os tipos dos valores são simples, o operador será do tipo máximo (veja Conversão de Tipos (type casting)).
  3. Se algum dos valores é uma enumeração e o segundo valor é de um tipo numérico, a enumeração é substituída por int e a segunda regra é aplicada.
  4. Se ambos os valores são enumerações, seus tipos devem ser idênticos, e o operador será do tipo enumeração.

Restrições ao tipos user-defined (classes ou estruturas definidas pelo usuário):

  1. Os tipos devem ser idênticos ou um deve ser derivado do outro.
  2. Se os tipo não forem idênticos (herança), então a filha é implicitamente convertida para o pai, isto é, o operador será do tipo paterno.
  3. Não confunda objetos com ponteiros - ambas as expressão ou são objetos ou são ponteiros. NULL pode ser usado para ponteiro.

Observação

Cuidado ao usar o operador condicional como um argumento de uma função de sobrecarga, porque o tipo do resultado de um operador condicional é definido na durante a compilação do programa. E este tipo é definido como a maior dos tipos "expression2" e "expression3".

Exemplo:

void func(double d) { Print("double argumento: ",d); }
void func(string s) { Print("string argumento: ",s); }
 
bool   Expression1=true;
double Expression2=M_PI;
string Expression3="3.1415926";
 
void OnStart()
  {
   func(Expression2);
   func(Expression3);
 
   func(Expression1?Expression2:Expression3);   // aviso sobre conversão implícita para string
   func(!Expression1?Expression2:Expression3);  // aviso sobre conversão implícita para string
  }
 
//   Resultado:
//   double argumento: 3.141592653589793
//   string argumento: 3.1415926
//   string argumento: 3.141592653589793
//   string argumento: 3.1415926

Também Veja

Inicialização de Variáveis, Visibilidade Escopo e Tempo de Vida de Variáveis, Criando e Excluindo Objetos