Ternärer Operator ?:

Gesamtform des ternären Operators sieht so aus:

Ausdruck1? Ausdruck2:Ausdruck3

Als erster Operand – "Ausdruck1" – kann jeder Ausdruck verwendet werden, dessen Ergebnis der Wert bool ist. Wenn das Ergebnis true ist, wird die Anweisung durchgeführt, die vom zweiten Operator vorgegeben wird, d.h. "der Ausdruck2".

Wenn aber der erste Operand false  wird der dritte Operand - "Ausdruck3" durchgeführt. Der zweite und der dritte Operand muessen Werte eines Typs Typs zurückgeben und den Typ void nicht haben. Ergebnis der Durchführung des Wenn-Operators ist das Ergebnis des Ausdrucks2 oder Ergebnis des Ausdrucks3, abhängig vom Ergebnis des Ausdrucks1.

//--- normieren wir Differenz unter Eröffnungspreisen und Schlusspreisen im Tagsausmass 
double true_range = (High==Low)?0:(Close-Open)/(High-Low);

Diese Aufzeichnung ist der nächsten äquivalent

   double true_range;
   if(High==Low)true_range=0;               // wenn High und Low gleich sind
   else true_range=(Close-Open)/(High-Low); // wenn Ausmass nicht Null ist

 

Einschränkungen bezüglich der Verwendung des Operators #

Basierend auf dem Wert von "Ausdruck1", muss der Operator einen der zwei Werte zurückgeben - entweder "Ausdruck2" oder "Ausdruck3". Es gibt einige Einschränkungen auf diese Ausdrücke:

  1. Verwechseln Sie nicht den benutzerdefinierten Typ mit dem einfachen Typ oder Enumeration. NULL kann fur den Zeiger verwendet werden.
  2. Wenn Typen von Werten einfach sind, wird der Operator des maximalen Typs sein (siehe Typ-Umwandlung).
  3. Wenn einer der Werte eine Enumeration ist und die zweite von einem numerischen Typ ist, wird die Enumeration durch int ersetzt und die zweite Regel angewendet wird.
  4. Wenn beide Werte Enumerationen sind, müssen ihre Typen identisch sein, und der Operator wird vom Enumeration-Typ sein.

Einschränkungen für die benutzerdefinierte Typen (Klassen oder Strukturen):

  1. Typen müssen identisch sein oder sollte eine von dem anderen abgeleitet werden.
  2. Wenn Typen nicht identisch sind (Vererbung), dann wird das Kind implizit zum übergeordneten Typ umgewandelt, dh der Operator wird von der übergeordneten Typ sein.
  3. Verwechseln Sie nicht das Objekt und den Zeiger - beide Ausdrücke sind entweder Objekte oder Zeiger. NULL kann für den Zeiger verwendet werden..

Hinweis

Seien Sie vorsichtig bei der Verwendung des Wenn-Operators als Argument für eine überladene Funktion, da der Typ des Resultats des Wenn-Operators zum Zeitpunkt der Kompilation des Programms definiert wird. Und dieser Typ ist wie die größeren vom Typen "Ausdruck2" und "Ausdruck3" definiert.

Beispiel:

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);   // erhalten Compiler-Warnung über explizite Umwandlung auf den Typ string
   func(!Expression1?Expression2:Expression3);  // erhalten Compiler-Warnung über explizite Umwandlung auf den Typ string
  }
 
//   Ergebnis:
//   double argument: 3.141592653589793
//   string argument: 3.1415926
//   string argument: 3.141592653589793
//   string argument: 3.1415926

Sehen Sie auch

Initialisierung der Variablen, Sichtbereich und Lebensdauer der Variablen, Erzeugung und Entfernung der Objekte