Bedingte Operatoren (Delphi)

Aus RAD Studio
Wechseln zu: Navigation, Suche

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.

Hinweis: Wenn zwei Typen nicht zusammenpassen und nicht kompatibel sind, gibt der Compiler folgende Fehlermeldung aus: [dcc32 Error] Unit31.pas(38): E2010 Incompatible types: 'string' and 'Integer'
Hinweis: Bitte beachten Sie, dass sich der Ausdruck 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.

Siehe auch