Article de reference

Conditionnel (programmation informatique)

Diagramme de flux Si-alors-sinon Un diagramme de flux imbriqué si-alors-sinon En programmation informatique , une instruction conditionnelle dirige le flux d'exécution du progra...

Diagramme de flux Si-alors-sinon
Un diagramme de flux imbriqué si-alors-sinon

En programmation informatique , une instruction conditionnelle dirige le flux d'exécution du programme en fonction de la valeur d'une condition ; une expression booléenne . Une expression conditionnelle est évaluée à une valeur sans modifier le flux d'exécution.

De nombreux langages de programmation (comme le C ) possèdent des instructions et expressions conditionnelles distinctes. En programmation fonctionnelle pure , une expression conditionnelle est sans effet de bord ; en revanche, de nombreux langages de programmation fonctionnelle avec expressions conditionnelles (comme Lisp) prennent en charge les effets de bord.

de pseudocode . La partie représentée par l' espace réservé à la condition est une expression qui s'évalue à vrai ou faux. Si la condition est vraie, le contrôle est transféré à la clause « consequent » , puis à la clause « after » une fois l'exécution terminée bloc d'instructions.else alternative

BASIC , une instruction if-then-else ne pouvait contenir que des instructions goto , ce qui engendrait souvent un code spaghetti difficile à lire . Par conséquent, la programmation structurée , qui organise le flux de contrôle par blocs de code, a gagné en popularité, jusqu'à devenir la norme dans la plupart des variantes de BASIC et dans tous les langages. Ces mécanismes et principes s'inspiraient de la famille de langages ALGOL , dont Pascal et Modula-2 . Bien qu'il soit possible d'utiliser goto de manière structurée, la programmation structurée facilite cette utilisation. Une instruction if-then-else structurée est un élément clé de la programmation structurée et est présente dans la plupart des langages populaires tels que C , Java , JavaScript et Visual Basic .

Suspendu autre

imbriquées dans certains langages anciens tels qu'ALGOL 60 était imprécise ; la syntaxe ne permettait pas de toujours spécifier la même interprété soit comme signifiant :
du else orphelin . Il est résolu de diverses manières, selon le langage (dans certains, au moyen d’une syntaxe de fin de bloc explicite (comme
ALGOL 68 , le « Rapport préliminaire » de 1968 (diffusé en supplément du Bulletin ALGOL n° 26) utilisait encore le mot-clé gras elsf dans les conditionnelles « abrégées ». L’orthographe elif a ensuite été normalisée dans le « Rapport révisé sur le langage algorithmique ALGOL 68 » (1973), qui répertorie à la fois les mots en gras et leurs symboles « abrégés », où elif correspond à dans la forme compacte Ada , le mot-clé `elseif` simplifie la syntaxe de l'instruction `if` . PHP prend également en charge ce mot-clé , aussi bien pour ses syntaxes avec accolades que pour celles avec deux-points . Perl et Ruby proposent le mot-clé `elseif` pour éviter le grand nombre d'accolades qu'exigeraient de multiples instructions `if` et ` elseif`. Python utilise le mot-clé spécial `elseif` car la structure est délimitée par l'indentation plutôt que par des accolades ; ainsi, une utilisation répétée de `if` et `elseif` nécessiterait une indentation accrue après chaque condition. Visual Basic prend en charge `elseif` . De même, les anciens shells UNIX (regroupés ultérieurement dans la syntaxe des shells POSIX ) utilisent également `elseif` , mais offrent la possibilité de délimiter les arguments par des espaces, des sauts de ligne ou les deux.Simula , Pascal , BCPL et C , cette syntaxe particulière pour cette Java , ECMAScript , etc. Cela fonctionne car, dans ces langages, toute instruction (ici, `if` if cond...) peut suivre une condition sans être placée dans un bloc.instruction switch . Dans un langage qui ne possède pas d'instruction switch, ces conditions peuvent être encodées sous la forme d'une chaîne if-then-else.

instruction Switchinstruction `switch` permet des branchements multiples, comparant souvent la valeur d'une expression à des constantes et transférant le contrôle au code de la première correspondance. Elle prévoit généralement une action par défaut si aucune correspondance n'est trouvée. Un compilateur optimisant peut utiliser une table de contrôle pour implémenter la logique d'une instruction `switch`. Dans un langage dynamique, les cas peuvent ne pas se limiter aux expressions constantes et s'étendre à la correspondance de motifs , comme dans l' exemple de script shell à droite, où `*)` implémente le cas par défaut sous la forme d'une expression régulière correspondant à n'importe quelle chaîne de caractères.

conditionnel gardé

Le langage de commandes gardées (GCL) d' Edsger Dijkstra prend en charge l'exécution conditionnelle sous forme de liste de commandes composées d'une garde booléenne (correspondant à une condition ) et de l'instruction correspondante. En GCL, seule l'instruction dont la garde est vraie est évaluée, mais laquelle est arbitraire. Dans ce code

si G0 → S0 □ G1 → S1 ... □ Gn → Sn fi

Les G <sub> i </sub> représentent les conditions de garde et les S <sub>i </sub> les instructions. Si aucune condition de garde n'est vraie, le comportement du programme est indéfini.

GCL est principalement destiné au raisonnement sur les programmes, mais des notations similaires ont été implémentées dans Concurrent Pascal et occam .

Arithmétique si

La première instruction conditionnelle en Fortran, jusqu'à Fortran 77 , était l'instruction arithmétique if qui sautait à l'une des trois étiquettes selon qu'une valeur (de type entier, réel ou double précision) est <0, 0 ou >0.

Dans le code suivant, le contrôle est transféré à l'une des étiquettes en fonction de la valeur de goto` , l'arithmétique `if` est non structurée, contrairement à la programmation structurée . C'était la seule instruction conditionnelle de l'implémentation originale de Fortran sur l' ordinateur IBM 704. Sur cet ordinateur, l'opcode de test et de branchement disposait de trois adresses, une pour chaque état. D'autres ordinateurs utilisaient des registres d'indicateurs (positif, zéro, négatif, pair, dépassement de capacité, retenue) associés aux dernières opérations arithmétiques et employaient des instructions telles que « Branchage si l'accumulateur est négatif » puis « Branchage si l'accumulateur est nul », ou similaires. Notez que l'expression n'est évaluée qu'une seule fois et que, dans les cas de dépassement de capacité, comme lors des calculs sur les entiers, les indicateurs de dépassement de capacité et de retenue sont également pris en compte.

L'instruction arithmétique IF a été déclarée obsolète à partir de la norme Fortran 90. Elle a été supprimée de la norme Fortran 2018. Cependant, la plupart des compilateurs continuent de la prendre en charge pour assurer la compatibilité avec les anciens codes.

Dans Smalltalk

Contrairement à d'autres langages, en Smalltalk, l'instruction conditionnelle n'est pas une construction du langage mais définie dans la classe Booleancomme une méthode abstraite qui prend deux paramètres, tous deux des fermetures . BooleanCette classe possède deux sous-classes, Trueet False, qui définissent toutes deux la méthode, Trueexécutant uniquement la première fermeture, Falseet exécutant uniquement la seconde fermeture.

JavaScript prend en charge les instructions if-else, similaires à la syntaxe C. L'exemple suivant contient une condition vraie si le nombre flottant aléatoire (valeur entre 0 et 1) est supérieur à 0,5. Cette condition est utilisée pour choisir aléatoirement entre l'affichage de…Vous avez obtenu Pile !" ) ; } else { console.log ( " Vous avez obtenu Face !" ) ; }

Les instructions conditionnelles peuvent être enchaînées comme indiqué ci-dessous :

Une personne a gagné !" ) ; } else if ( x < 2 / 3 ) { console.log ( " Deux personnes ont gagné !" ); } else { console.log ( "Trois personnes ont gagné à égalité ! " ) ; }

lambda-calcul

En lambda-calcul , le concept de conditionnelle if-then-else peut être exprimé à l'aide des expressions suivantes :

vrai = λx. λy. x faux = λx. λy. y siAlorsSinon = (λc. λx. λy. (cxy))
  1. curryfication ), elle renvoie le premier argument donné.
  2. curryfication ), elle renvoie le deuxième argument donné.
  3. objet fonction sans être appelée.

    Dans un système où les nombres peuvent être utilisés sans définition (comme Lisp, les mathématiques traditionnelles sur papier, etc.), ce qui précède peut être exprimé comme une seule fermeture comme suit :

    John McCarthy lors de ses recherches sur le traitement symbolique et le LISP à la fin des années 1950.

    Exemples

    Algol

    ALGOL 60 et d'autres membres de la famille ALGOL autorisent if–then–elseles expressions conditionnelles. L'idée d'inclure ces expressions a été suggérée par John McCarthy, mais le comité ALGOL a opté pour le langage courant plutôt que pour la syntaxe mathématique de McCarthy.

    20 then 1 else 2 "
    mavariable := si x > 20 alors 1 sinon 2

    Toutes les instructions composées sont terminées (protégées) par des parenthèses fermantes distinctives :

    • clauses de choix SI :
    SI condition ALORS instructions [ SINON instructions ] FI Forme « brève » : ( condition | instructions | instructions )
    SI condition1 ALORS instructions SINON SI condition2 ALORS instructions [ SINON instructions ] FI Forme abrégée : ( condition1 | instructions |: condition2 | instructions | instructions )

    Ce schéma évite non seulement le problème des instructions else orphelines , mais aussi l'utilisation BEGINde « and » ENDdans des séquences d'instructions imbriquées .

    • clauses de choix CASE :
    CASE switch IN instructions, instructions,... [ OUT instructions ] ESAC forme « brève » : ( switch | instructions, instructions,... | instructions )
    CASE switch1 IN instructions, instructions,... OUSE switch2 IN instructions, instructions,... [ OUT instructions ] ESAC Forme « brève » de l’instruction CASE : ( switch1 | instructions, instructions,... |: switch2 | instructions, instructions,... | instructions )

    Exemple de clause de choix avec symboles Brief :

    PROC jours dans le mois = ( INT année, mois) INT : (mois| 31, (année÷×4=0 ∧ année÷×100≠0 ∨ année÷×400=0 | 29 | 28 ), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 );

    Zézayer

    Les expressions conditionnelles ont toujours été un élément fondamental de LispScheme , Racket et Common LispHaskell 98, il n'existe qu'une expression `if` , pas d'instruction `if` , et la elsepartie `if` est obligatoire, car toute expression doit avoir une valeur. La logique qui serait exprimée par des conditions dans d'autres langages est généralement exprimée par filtrage par motif dans des fonctions récursives.

    Comme Haskell est paresseux , il est possible d'écrire des structures de contrôle, telles que `if` , comme des expressions ordinaires ; l'évaluation paresseuse signifie qu'une fonction `if` n'évalue que la condition et la branche appropriée (alors qu'un langage strict évaluerait les trois). Cela peut s'écrire ainsi :

    a -> a -> a if' True x _ = x if' False _ y = y "
    si' :: Bool -> a -> a -> a si' True x _ = x si' False _ y = y

    Langages de type C

    Le langage C et les langages apparentés prennent en charge un opérateur ternaire qui permet de créer des expressions conditionnelles telles que :

    condition ? valeur-vraie : valeur-fausse

    Si la condition est vraie, l'expression est évaluée à vrai ; sinon à faux . Dans le code suivant, la variable r prend la valeur « foo » si x > 10, et la valeur « bar » sinon.

    10 ? \"foo\" : \"bar\"; "
    r = x > 10 ? "foo" : "bar" ;

    Pour obtenir le même résultat avec une instruction if, il faudrait plus d'une instruction et la mentionner ; sinon r = "bar" ;

    Certains affirment que l'instruction explicite if-then est plus facile à lire et qu'elle peut être compilée en un code plus efficace que l'opérateur ternaire, tandis que d'autres affirment que les expressions concises sont plus faciles à lire et meilleures car elles comportent moins de clauses répétées.

Visual Basic

Visual Basic et dans certains autres langages, une fonction appelée `If` IIfest fournie et peut être utilisée comme expression conditionnelle. Cependant, son comportement diffère de celui d'une véritable expression conditionnelle, car les deux branches (vrai et faux) sont toujours évaluées ; seule la valeur de l'une est ignorée, tandis que celle de l'autre est renvoyée par la fonction `If`.

Tcl

Tcl,if `is` n'est pas un mot-clé mais une fonction (appelée commande ou `is` en Tcl proc). Par exemple :

10} { puts \"Foo!\" } "
si { $x > 10 } { affiche "Foo!" }

Cette fonction est appelée en lui ifpassant deux arguments : la condition et la branche « vrai ». Les deux arguments sont des chaînes de caractères (en Tcl, tout ce qui se trouve entre accolades est une chaîne de caractères).

Dans l'exemple ci-dessus, la condition n'est pas évaluée avant l'appel de la fonction. Au lieu de cela, l'implémentation de la iffonction reçoit la condition sous forme de chaîne de caractères et est responsable de l'évaluation de cette chaîne comme une expression dans la portée de l'appelant.

Un tel comportement est possible grâce aux commandes uplevel`and` expr. Uplevel permet d'implémenter de nouvelles structures de contrôle sous forme de procédures Tcl (par exemple, Uplevel peut être utilisé pour implémenter la boucle `while` sous forme de procédure Tcl).

Puisqu'il ifs'agit en réalité d'une fonction, elle renvoie également une valeur. La valeur de retour de la commande est le résultat du script du corps qui a été exécuté, ou une chaîne vide si aucune des expressions n'était non nulle et qu'il n'y avait pas de corpsN.

Rouiller

Rust , if`void` est toujours une expression. Elle est évaluée à la valeur de la branche exécutée, ou au type unitaire ()si aucune branche n'est exécutée. Si une branche ne renvoie aucune valeur, elle est évaluée à ` ()null` par défaut. Pour garantir que le iftype de l'expression est connu à la compilation , chaque branche doit être évaluée à une valeur du même type. C'est pourquoi une elsebranche `void` est pratiquement obligatoire, sauf si les autres branches sont évaluées à ` null` (), car une expression ifsans `void` elsepeut toujours être évaluée à ` ()null` par défaut.

Ce qui suit attribue ); }

Correspondance de modèles

Le filtrage par motif est une alternative aux instructions conditionnelles (telles que if-then-else et switch). Il est disponible dans de nombreux langages dotés de fonctionnalités de programmation fonctionnelle, comme Wolfram Language , ML et bien d'autres. Voici un exemple simple écrit en OCaml :

cook pie | \"coconut\" -> cook dango_mochi | \"banana\" -> mix;; "
Associer les fruits avec | "pomme" -> faire une tarte | "noix de coco" -> faire des dango_mochi | "banane" -> mélanger ;;

La puissance du filtrage par motif réside dans sa capacité à faire correspondre de manière concise non seulement les actions, mais aussi les valeurs, à des modèles de données. Voici un exemple écrit en Haskell qui illustre ces deux fonctionnalités :

des tableaux associatifs ou des structures de données comparables, comme Python , Perl , PHP ou Objective-C , il est idiomatique de les utiliser pour implémenter l'affectation conditionnelle.

) animaux_connus = { "Chien" : "Fido" , "Chat" : "Meowsles" , "Oiseau" : "Tweety" , } mon_nom = animaux_connus [ animal ]

Dans les langages qui possèdent des fonctions anonymes ou qui permettent à un programmeur d'assigner une fonction nommée à une référence de variable, le flux conditionnel peut être implémenté en utilisant un dictionnaire comme table de répartition .

Prédication de branche

Une alternative aux instructions de branchement conditionnel est la prédication de branchement . La prédication est une caractéristique architecturale qui permet d'exécuter des instructions de manière conditionnelle au lieu de modifier le flux de contrôle .

Référence croisée du système de choix

Ce tableau fait référence à la spécification la plus récente de chaque langage. Pour les langages ne disposant pas de spécification, la dernière implémentation officiellement publiée est indiquée.

langage de programmationStructuré siswitch –select–caseExpressions conditionnellesArithmétique siAppariement de modèles [A]
alorsautresinon–si
AdaALGOL-60[C]ALGOL 68APLCoquille BashC , C++[B] [C]C#[B] [C]COBOL[C]EiffelOuiFa#[D]Fortran[G][je]Aller[C]Haskell[C][D]Java[C]ECMAScript ( JavaScript )[C]MathematicaOberonPerlPHPPascal , Objet Pascal ( Delphi )PythonQuickBASICRubis[H]
Rouiller[D]Scala[C]SQL[F][F]RapideTclVisual Basic , classiqueVisual Basic .NETWindows PowerShell^ Ceci fait référence à la correspondance de modèles en tant que construction conditionnelle distincte dans le langage de programmation – par opposition à la simple prise en charge de la correspondance de modèles de chaînes, telle quedes expressions régulières.
  • 1 2 Une directive #ELIF est utilisée dans ledu préprocesseurqui est utilisé pour modifier le code avant la compilation ; et pourinclured'autres fichiers.
  • Dans la famille de langages C, ainsi qu'en COBOL et Haskell, on rencontre fréquemment non pas une caractéristique du langage, mais un ensemble d'instructions `if then else` imbriquées et indépendantes, combinées à une structure de code source particulière. Cependant , cela signifie également qu'une structure `else-if` distincte n'est pas réellement nécessaire dans ces langages.else if
  • 1 2 3 Les expressions de cas en Haskell et les expressions de correspondance en F# et Haskell permettent à la fois l'utilisation de switch-case et de la correspondance de modèles.
  • En Ruby ,case lad'expressions régulièresfait partie des alternatives de contrôle de flux conditionnel disponibles. Pour un exemple, consultezcettequestion sur Stack Overflow.
  • SQL possède deux constructions similaires qui remplissent les deux rôles, toutes deux introduites dansSQL-92expression« recherchéefonctionne comme, tandis qu'uneexpression « simple »fonctionne comme une instruction `switch`. Pour plus de détails et d'exemples, consultez ladocumentation de `Case` (SQL).CASE
  • ^ Fortran 90 a introduit l'MERGEopérateur intrinsèque. Fortran 2023 a introduit l'opérateur ternaire de type C.
  • ^ La correspondance de modèles a été ajoutée dans Ruby 3.0. Certaines constructions de correspondance de modèles sont encore expérimentales.
  • ^ Les opérations arithmétiquesifont été déclarées obsolètes dans Fortran 90. Elles ont été supprimées dans la norme Fortran 2018.
  • Plus d articles de Worldlex Wiki

    Revenez a l index pour explorer davantage de pages sur l histoire, la science, la culture, la geographie et la societe en francais.

    Explorer l index