Compilation conditionnelle (Delphi)

De RAD Studio
Aller à : navigation, rechercher

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.

Remarque: Si les deux types ne correspondent pas ou sont incompatibles, le compilateur émet un message d'erreur semblable à : [dcc32 Error] Unit31.pas(38): E2010 Incompatible types: 'string' and 'Integer'
Remarque: Il est important de noter que 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é.

Voir aussi