Bedingte Operatoren (Delphi)
Nach oben zu Ausdrücke (Delphi)
Bedingungsoperator if
Syntax:
if <BoolExpr> then <thenValue> else <elseValue>
Bemerkungen:
Dieser konditionale Operator verhält sich wie der Operator ?:, die Syntax orientiert sich jedoch mehr an Pascal und ähnelt dem Konstrukt if-then-else.
Das folgende Beispiel zeigt zwei Versionen eines einfachen Zuweisungsausdrucks. Die erste Version basiert auf einer herkömmlichen Anweisung und die zweite auf dem Operator if:
if Left < 100 then
X := 22
else
X := 45;
X := if Left < 100 then 22 else 45;
Der Hauptunterschied ist, dass der Operator folgendermaßen als Teil jeden beliebigen Ausdrucks verwendet werden kann:
ShowMessage (if Left < 100 then 'Small' else 'Big')
Hier sehen Sie die Grammatikänderung zwischen dem alten und dem neuen Ausdruck.
Alt:
Expression -> SimpleExpression [ RelOp SimpleExpression ] . . .
Neu:
Expression -> SimpleExpression [ RelOp SimpleExpression ] . . .
-> IF Expression THEN Expression ELSE Expression
Der Typ der Ergebnisausdrücke hängt von den beiden, als Parameter übergebenen Typen ab. Nicht alle Typkombinationen sind zulässig. In der folgenden Tabelle finden Sie eine Zusammenfassung der Kombinationen:
| Typ 1 | Typ 2 | Ergebnistyp |
|---|---|---|
| AnsiChar | AnsiChar | AnsiChar |
| AnsiString | AnsiString, AnsiChar | AnsiString |
| Array | Array | Array mit demselben Elementtyp |
| Boolesche Typen | Boolesche Typen | Allgemeiner boolescher Typ oder boolescher Typ |
| Klassenreferenz | Klassenreferenz, nil | Allgemeiner Typ, Basistyp oder TClass |
| Dynamisches Array | Dynamisches Array | Allgemeiner dynamischer Array-Typ |
| Enum-Typ | Enum-Typ | Allgemeiner Enum-Typ |
| Datei | Datei | Fehler (verwenden Sie einen Zeiger auf den Dateityp) |
| Instanz | Instanz, nil | Allgemeiner Typ, Basistyp oder TObject |
| Integrale Typen | Integrale Typen | Allgemeiner integraler Typ oder der Typ, der beide Bereiche abdeckt |
| Integrale Typen | Reelle Typen | Reeller Typ |
| Interface | Interface, nil | Allgemeiner Typ, Basistyp oder IInterface |
| nil | AnsiChar, ShortString, AnsiString, WideChar, WideString | Zeiger auf WideChar |
| Object | Object | Objekttyp |
| Zeiger auf AnsiChar | AnsiChar, ShortString, AnsiString-Literal | Zeiger auf AnsiChar |
| Zeiger auf AnsiChar | Zeiger auf WideChar-Literal | Zeiger auf WideChar |
| Zeiger auf WideChar | AnsiChar, ShortString, AnsiString, WideChar, WideString, UnicodeString | UnicodeString |
| Zeigertypen | Zeigertypen | Allgemeiner boolescher Typ oder Zeigertyp |
| Prozedur | Prozedur | Prozedurtyp, wenn sie dieselbe Signatur haben |
| Procedure of Object | Procedure of Object | Prozedur für Objekttyp, wenn sie dieselbe Signatur haben |
| Reelle Typen | Reelle Typen | Der reelle Typ mit der größeren Genauigkeit |
| Record | Record | Record-Typ |
| Referenz auf Prozedur Anonyme Methode |
Referenz auf Prozedur Anonyme Methode |
Referenz auf den Prozedurtyp, wenn sie dieselbe Signatur haben |
| Menge | Menge | Allgemeiner Mengentyp oder großer Mengentyp, wenn die Liste ein Literal ist |
| Kurzer String | Kurzer String, AnsiChar | Längerer kurzer String |
| Text | Text | Fehler (verwenden Sie einen Zeiger auf den Texttyp) |
| UnicodeString | UnicodeString, WideString, AnsiString, Kurzer String, WideChar, AnsiChar | UnicodeString |
| Variante | Variante | Varianttyp |
| WideChar | WideChar | WideChar |
| WideChar | AnsiChar, AnsiString | UnicodeString |
| WideString | WideString, AnsiString, WideChar, AnsiChar | WideString |
Für den Ausdruck then oder else kann eine Typumwandlung verwendet werden, um die Auswertung des Ausdruckstyps durch den Compiler zu unterstützen.
if-then-else von der Anweisung if-then-else unterscheidet. Der Ausdruck hat einen einzigen Typ. Wenn die Typen der Ausdrücke then und else unterschiedlich sind, ist der Typ des Ausdrucks der allgemeine Typ der beiden Ausdruckstypen, der auch als Typ Supremum (Least Upper Bound, LUB) bezeichnet wird.Beachten Sie bei der Verwendung des Operators if-then-else mit einem Ausdruck, dass andere Operationen (z. B. Addition) höhere Prioritäten haben, was zu unerwarteten Fehlern führen kann. Verwenden Sie zusätzliche Klammern wie bei booleschen Operatoren mit niedriger Priorität.