Opérateur Ternaire ?:

La forme générale de l'opérateur ternaire est la suivante :

expression? expression: expression3

Pour la première opérande - "expression1" - toute expression qui résulte en une valeur de type bool peut être utilisée. Si le résultat est vrai (true), alors l'opérateur définit par la seconde opérande, c'est à dire "expression2" est exécutée.

Si la première opérande est fausse (false), la troisième opérande - "expression3" est effectuée. Les seconde et troisième opérande, c'est à dire "expression2" et "expression3" doivent retourner des valeurs du même type et ne doivent pas retourner void type. Le résultat de l'exécution de l'opérateur conditionnel est le résultat de expression2 ou le résultat de expression3, suivant le résultat de expression1.

//--- différence normalisée entre les prix open et close pour le range d'une journée
double true_range = (High==Low)?0:(Close-Open)/(High-Low);

Cette entrée est équivalente à :

   double true_range;
   if(High==Low)true_range=0;               // si High et Low sont égaux
   else true_range=(Close-Open)/(High-Low); // si le range n'est pas nul

 

Utilisation de l'Opérateur et Restrictions #

Suivant la valeur de "expression1", l'opérateur doit retourner l'une des deux valeurs - soit "expression2" ou "expression3". Il y a plusieurs limitations à ces expressions :

  1. Ne mélangez pas un type utilisateur avec un type simple ou avec une énumération. NULL peut être utilisé comme pointeur.
  2. Si les types des valeurs sont simples, l'opérateur sera du type maximum (voir Conversion de Type).
  3. Si l'une des valeurs est un énumération et que la seconde est d'un type numérique, l'énumération est remplacé par int et la deuxième règle est appliquée.
  4. Si les deux valeurs sont des énumérations, leurs types doivent être identiques et l'opérateur sera de type énumération.

Restrictions pour les types utilisateurs (classes ou structures) :

  1. Les types doivent être identiques ou l'un doit dériver de l'autre.
  2. Si les types ne sont pas identiques (héritage), alors l'enfant est implicitement converti dans le type du parent, c'est à dire que l'opérateur sera du type du parent.
  3. Ne mélangez pas un objet et un pointeur - les deux expressions doivent être soit des objets, soit des pointeurs. NULL peut être utilisé pour un pointeur.

Note

Faites attention lors de l'utilisation de l'opérateur conditionnel comme argument d'une fonction surchargée, car le type du résultat d'un opérateur conditionnel est défini au moment de la compilation du programme. Et ce type est déterminé comme étant le plus grand des types de "expression2" et "expression3".

Exemple :

void func(double d) { Print("argument double : ",d); }
void func(string s) { Print("argument string : ",s); }
 
bool   Expression1=true;
double Expression2=M_PI;
string Expression3="3.1415926";
 
void OnStart()
  {
   func(Expression2);
   func(Expression3);
 
   func(Expression1?Expression2:Expression3);   // avertissement sur le cast implicite vers le type string
   func(!Expression1?Expression2:Expression3);  // avertissement sur le cast implicite vers le type string
  }
 
//   Résultat :
//   double argument: 3.141592653589793
//   string argument: 3.1415926
//   string argument: 3.141592653589793
//   string argument: 3.1415926

Voir aussi

Initialisation des Variables, Portée de Visibilité et Cycle de Vie des Variables, Créer et Supprimer des Objets