Compilation conditionnelle (Delphi)
Remonter à Expressions (Delphi)
Opérateur conditionnel If
Syntaxe :
if <BoolExpr> then <thenValue> else <elseValue>
Remarques :
Le comportement de cet opérateur conditionnel est similaire à celui de l'opérateur ?: mais la syntaxe ressemble davantage à une syntaxe Pascal avec une construction if-then-else.
L'exemple suivant illustre une expression d'affectation simple utilisée dans deux versions ; la première version utilise une instruction classique et la seconde un opérateur if :
if Left < 100 then
X := 22
else
X := 45;
X := if Left < 100 then 22 else 45;
La principale différence réside dans le fait que l'opérateur peut être utilisé comme partie intégrante de n'importe quelle expression, comme suit :
ShowMessage (if Left < 100 then 'Small' else 'Big')
Dans cet exemple, vous pouvez voir le changement de syntaxe entre l'ancienne expression et la nouvelle.
Ancienne :
Expression -> SimpleExpression [ RelOp SimpleExpression ] . . .
Nouvelle :
Expression -> SimpleExpression [ RelOp SimpleExpression ] . . .
-> IF Expression THEN Expression ELSE Expression
Le type des expressions résultantes dépend des deux types transmis comme paramètres. Toutes les combinaisons de types ne sont pas légitimes. Le tableau suivant affiche un résumé des combinaisons possibles :
| Type 1 | Type 2 | Type de résultat |
|---|---|---|
| AnsiChar | AnsiChar | AnsiChar |
| AnsiString | AnsiString, AnsiChar | AnsiString |
| Array | Array | Tableau du même type d'élément |
| Types booléens | Types booléens | Type booléen commun ou type booléen |
| Référence de classe | Référence de classe, nil | Type commun, type de base, ou TClass |
| Tableau dynamique | Tableau dynamique | Type de tableau dynamique commun |
| Type Enum | Type Enum | Type Enum commun |
| Fichier | Fichier | Erreur (utiliser le pointeur vers le type Fichier) |
| Instance | Instance, nil | Type commun, type de base, ou TObject |
| Types intégraux | Types intégraux | Type intégral commun, ou type couvrant les deux catégories |
| Types intégraux | Types réels | Type réel |
| Interface | Interface, nil | Type commun, type de base, ou IInterface |
| nil | AnsiChar, ShortString, AnsiString, WideChar, WideString | Pointeur sur un WideChar |
| Object | Object | Type Objet |
| Pointeur sur AnsiChar | AnsiChar, ShortString, AnsiString literal | Pointeur sur AnsiChar |
| Pointeur sur AnsiChar | Pointeur sur un WideChar littéral | Pointeur sur un WideChar |
| Pointeur sur un WideChar | AnsiChar, ShortString, AnsiString, WideChar, WideString, UnicodeString | UnicodeString |
| Pointer types | Pointer types | Common pointer type, or Pointer type. |
| Procédure | Procédure | Type de procédure, si signature identique |
| Procédure d'objet | Procédure d'objet | Procédure pour type Objet si signature identique |
| Types réels | Types réels | Le type réel ayant la plus grande précision |
| Enregistrement | Enregistrement | Type Enregistrement |
| Référence à une procédure Méthode anonyme |
Référence à une procédure Méthode anonyme |
Référence au type de Procédure, si signature identique |
| Ensemble | Ensemble | Type Ensemble commun, ou type d'ensemble étendu en cas de littéraux de liste |
| Chaîne courte | Chaîne courte, AnsiChar | Chaîne courte plus long |
| Texte | Texte | Erreur (utiliser le pointeur vers le type Texte) |
| UnicodeString | UnicodeString, WideString, AnsiString, chaîne Short, WideChar, AnsiChar | UnicodeString |
| Variant | Variant | Type Variant |
| WideChar | WideChar | WideChar |
| WideChar | AnsiChar, AnsiString | UnicodeString |
| WideString | WideString, AnsiString, WideChar, AnsiChar | WideString |
L'expression then ou else peut utiliser un transtypage pour guider le compilateur lors de l'évaluation du type de l'expression.
if-then-else diffère de l'instruction if-then-else. L'expression a un type unique. Si les types des expressions then et else sont différents, le type de l'expression est le type commun des deux types d'expressions, aussi appelé le type Least Upper Bound (LUB).Si vous utilisez l'opérateur if-then-else au sein d'une expression, vous pouvez constater que les autres opérations comme l'addition par exemple, ont des priorités plus élevées, ce qui peut générer des erreurs inattendues. Vous devez utiliser des parenthèses supplémentaires comme avec les opérateurs booléens de faible priorité.