Operador Ternário ?
A forma geral do operador ternário é a seguinte:
expressão1 ? expressão2 : 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:
- Não confunda o tipo user-defined (definida pelo usuário) com o tipo simples ou enumerador. NULL pode ser usado para ponteiro.
- Se os tipos dos valores são simples, o operador será do tipo máximo (veja Conversão de Tipos (type casting)).
- 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.
- 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):
- Os tipos devem ser idênticos ou um deve ser derivado do outro.
- 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.
- 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