Conditional Operators (Delphi)

From RAD Studio
Jump to: navigation, search

Go Up to Delphi Compiler Directives (List) Index


If Conditional Operator

Syntax:

if <BoolExpr> then <thenValue> else <elseValue>

Remarks: This conditional operator is similar in behavior to the ?: operator but the syntax is more Pascal-oriented, resembling the if-then-else construct.

The following example shows a simple assignment expression used in two versions; the first version is based on a traditional statement and the second on an if operator:

if Left < 100 then
    X := 22
  else
    X := 45;
  X := if Left < 100 then 22 else 45;

The key difference is that the operator can be used as part of any expression, as follows:

ShowMessage (if Left < 100 then 'Small' else 'Big')

Here you can see the change in grammar from the old expression to a newer one.

Old:

Expression  -> SimpleExpression [ RelOp SimpleExpression ] . . .

New:

Expression  -> SimpleExpression [ RelOp SimpleExpression ] . . .
                -> IF Expression THEN Expression ELSE Expression

The type of the resulting expressions depends on the two types passed as parameters. Not all type combinations are legitimate. The table below shows a summary of the combinations:

Type 1 Type 2 Result type
AnsiChar AnsiChar AnsiChar
AnsiString AnsiString, AnsiChar AnsiString
Array Array Array of the same element type.
Boolean types Boolean types Common Boolean type or Boolean type.
Class reference Class reference, nil Common type, Base type, or TClass.
Dynamic array Dynamic array Common dynamic array type.
Enum type Enum type Common enum type.
File File Error (use pointer to File type).
Instance Instance, nil Common type, Base type, or TObject.
Integral types Integral types Common integral type, or the type that covers both ranges.
Integral types Real types Real type.
Interface Interface, nil Common type, Base type, or IInterface.
nil AnsiChar, ShortString, AnsiString, WideChar, WideString Pointer to WideChar
Object Object Object type.
Pointer to AnsiChar AnsiChar, ShortString, AnsiString literal Pointer to AnsiChar
Pointer to AnsiChar Pointer to WideChar literal Pointer to WideChar
Pointer to WideChar AnsiChar, ShortString, AnsiString, WideChar, WideString, UnicodeString UnicodeString
Pointer types Pointer types Common pointer type, or Pointer type.
Procedure Procedure Procedure type, if they have the same signature.
Procedure of object Procedure of object Procedure for object type if they have the same signature.
Real types Real types The real type with the greater precision.
Record Record Record type.
Reference to procedure
Anonymous Method
Reference to procedure
Anonymous Method
Reference to the procedure type, if they have the same signature.
Set Set Common set type, or large set type if list literals.
Short string Short string, AnsiChar Longer short string
Text Text Error (use pointer to Text type).
UnicodeString UnicodeString, WideString, AnsiString, Short string, WideChar, AnsiChar UnicodeString
Variant Variant Variant type.
WideChar WideChar WideChar
WideChar AnsiChar, AnsiString UnicodeString
WideString WideString, AnsiString, WideChar, AnsiChar WideString

The then or else expression can use a cast to guide the compiler's evaluation of the expression's type.

Note:
If the two types do not match and are incompatible, the compiler issues an error message as follows: [dcc32 Error] Unit31.pas(38): E2010 Incompatible types: 'string' and 'Integer'
Note:
It is important to note that the if-then-else expression differs from the if-then-else statement, the expression has a single type. When the type of the then and else expressions differ, the expression's type is the common type of the two expressions' types; also known as the Least Upper Bound (LUB) type.

When using the if-then-else operator within an expression, notice how other operations (e.g., addition) have higher priorities, which can lead to unexpected errors. Use extra parentheses, as is often done with low-priority Boolean operators.

See Also