Operatore Ternario ?:

La forma generale dell' operatore ternario è la seguente:

espressione? espressione: espressione3

Per il primo operando - "expression1" - qualsiasi espressione che si traduce in valore di tipo bool può essere utilizzata. Se il risultato è true, allora viene eseguito l'operatore stabilito dal secondo operando, vale a dire "expression2".

Se il primo operando è false, viene eseguito il terzo operando - "expression3". Il secondo operando ed il terzo operando, vale a dire "expression2" ed "expression3" devono restituire i valori di un certo tipo e non devono essere di tipo void. Il risultato dell'esecuzione dell' operatore condizionale è il risultato di expression2 o risultato dei expression3, a seconda del risultato di expression1.

//--- normalizzare la differenza tra il prezzo di apertura e chiusura per un intervallo di giorni
double true_range = (High==Low)?0:(Close-Open)/(High-Low);

Questa voce è equivalente alla seguente:

   double true_range;
   if(High==Low)true_range=0;               // se High e Low sono uguali
   else true_range=(Close-Open)/(High-Low); // se il range non è nullo

 

Restrizioni uso operatori #

Sulla base del valore di "expression1", l'operatore deve restituire uno dei due valori - o "expression2" o "expression3". Ci sono numerose limitazioni a queste espressioni:

  1. Non confondere il tipo definito dall'utente con il tipo semplice o l' enumerazione. NULL può essere utilizzato per puntatore.
  2. Se tipi di valori sono semplici, l'operatore sarà del tipo massimo (vedere Tipo di casting).
  3. Se uno dei valori è un' enumerazione ed il secondo è di tipo numerico, l'enumerazione viene sostituita da int e la seconda regola viene applicata.
  4. Se entrambi i valori sono enumerazioni, i loro tipi devono essere identici, e l'operatore sarà di tipo enumerazione.

Restrizioni per i tipi definiti-dall-utente (classi o strutture):

  1. I tipi devono essere identici o uno deve essere derivato derivato dall'altro.
  2. Se i tipi non sono identici (ereditarietà), allora il figlio è implicitamente castato al genitore, cioè l'operatore sarà di tipo genitore.
  3. Da non confondere l'oggetto ed il puntatore - entrambe le espressioni sono o oggetti o puntatori. NULL non può essere usato per il puntatore.

Nota

Fare attenzione quando si usa l'operatore condizionale come argomento di una funzione overloaded, perchè il tipo di risultato di un operatore condizionale è definito al momento della compilazione del programma. And this type is defined as the larger of the types "expression2" and "expression3".

Esempio:

void func(double d) { Print("argomento double: ",d); }
void func(string s) { Print("argomento string: ",s); }
 
bool   Expression1=true;
double Expression2=M_PI;
string Expression3="3.1415926";
 
voidOnStart()
  {
   func(Expression2);
   func(Expression3);
 
   func(Expression1?Expression2:Expression3);   // attenzione al casting implito a string
   func(!Expression1?Expression2:Expression3);  // attenzione al casting implicito a string
  }
 
//   Risultato:
//   argomento double: 3.141592653589793
//   argomento string: 3.1415926
//   argomento string: 3.141592653589793
//   argomento string: 3.1415926

Vedi anche

Inizializzazione delle Variabili, Visibilità Ambito e Durata delle Variabili, Creazione ed Eliminazione di Oggetti