Expressions et assignations Expressions arithmtiques Surcharge Expressions logiques

  • Slides: 19
Download presentation
Expressions et assignations • Expressions arithmétiques • Surcharge • Expressions logiques • Assignations 1

Expressions et assignations • Expressions arithmétiques • Surcharge • Expressions logiques • Assignations 1

Expressions arithmétiques Une expression arithmétique est une fonction qui associe un ou plusieurs nombres

Expressions arithmétiques Une expression arithmétique est une fonction qui associe un ou plusieurs nombres avec un autre nombre – le résultat. Les opérateurs sont généralement écrit en un format infixe (mais pas en Scheme). Précédence des opérateurs : l’ordre d’évaluation des opérateurs dans une expression. (Les parenthèses peuvent être utilisés pour spécifier un ordre explicite. ) 2

Expressions arithmétiques (2) Les opérateurs sont normalement regroupés ainsi: exposants: ** Opérateurs unaires: abs,

Expressions arithmétiques (2) Les opérateurs sont normalement regroupés ainsi: exposants: ** Opérateurs unaires: abs, préfixe + et -, etc. (aussi la négation) produits: *, /, div, mod etc. (aussi le et logique) sommes: + binaire, - binaire etc. (aussi le ou logique) 3

Précédence des opérateurs Les règles de précédence diffèrent d’un langage à l’autre. Pascal produits

Précédence des opérateurs Les règles de précédence diffèrent d’un langage à l’autre. Pascal produits > sommes C unaires > produits > sommes Ada exposants > produits > + et – unaires > produits Fortran exposants > produits > sommes 4

Associativité (1) Soit • un opérateur binaire quelconque. Associativité: De gauche à droite si

Associativité (1) Soit • un opérateur binaire quelconque. Associativité: De gauche à droite si x • y • z = (x • y) • z Pascal, Ada, C (tout les opérateurs normaux) De droite à gauche si x • y • z = x • (y • z) C++ ( ++ et --) Il y a aussi des opérateurs non-associatifs, comme l’exposant en Ada: x ** y ** z est synthétiquement incorrect, quoi que(x ** y) ** z et x ** (y ** z) sont correct. 5

Associativité (2) Certains langages n’ont pas de règles de précédence et une seul règle

Associativité (2) Certains langages n’ont pas de règles de précédence et une seul règle d’associativité. En APL: c’est toujours de droite à gauche. x + y * z veut dire x + (y * z) x * y + z veut dire x * (y + z) (!) En Smalltalk: toujours de gauche à droite. x * y + z veut dire (x * y) + z x + y * z veut dire (x + y) * z (!) 6

Expressions conditionnelles Introduite par Algol 60: if x > 0 then 1 else if

Expressions conditionnelles Introduite par Algol 60: if x > 0 then 1 else if x = 0 then 0 else -1 La même chose est disponible dans la famille de langages C: (x > 0 ? 1 : (x == 0 ? 0 : -1)) Les expressions conditionnelles sont essentielles en Scheme—ce sont une des principales structures de contrôle! 7

Surcharge « overloading » La surcharge se produit lorsqu’un nom ou un symbole possède

Surcharge « overloading » La surcharge se produit lorsqu’un nom ou un symbole possède peut être utilise de plusieurs façons différentes. Voici quelques exemples en Pascal: + addition d’entiers, addition de nombres à virgule flottante, concaténation de chaînes de caractères, union d’ensembles. * Multiplication d’entiers, multiplication de nombres à virgule flottante, intersection d’ensembles abs integer, real 8

Surcharge (2) La surcharge peut toujours être résolu selon le contexte si tout le

Surcharge (2) La surcharge peut toujours être résolu selon le contexte si tout le type de tout les opérandes est connu. Pour 2 + 3 c’est l’adition d’entiers. Pour "a" + "cde" c’est la concaténation. En Ada, la surcharge est un élément important du langage. Ada est extensible: un nouveau sens peut être donné à un opérateur, tout en maintenant l’autre sens. Il est aussi possible de surcharger en C++. 9

(3) La surcharge peut porter à confusion. En C: & et logique bit à

(3) La surcharge peut porter à confusion. En C: & et logique bit à bit et adresse, * multiplication et déréférence. En PL/I, = dénote l’égalité et l’assignation. En Prolog, la virgule est grandement surchargée. 1. Et logique a : - b, c, d. 2. Séparateur de parametres 3. Séparateur d’une liste 4. un functor: (b, c, d) signifie a(b, c, d) [b, c, d] , , b c d 10

Coercition Si des objets de deux types numériques sont les opérandes, on « promeut

Coercition Si des objets de deux types numériques sont les opérandes, on « promeut » celui du type le plus bas. Hiérarchie des types numériques en Fortran: integer < real < double < complex En Java byte, short et char sont presque toujours promu comme un int avant l’application d’une opération arithmétique—et reconvertie par la suite. 11

Expressions logiques Les opérateurs de comparaison: égal = == inégal <> plus petit <

Expressions logiques Les opérateurs de comparaison: égal = == inégal <> plus petit < plus petit ou égal plus grand > plus grand ou égal . EQ. != < <= > . NE. . LT. =<. LE. . GT. >= =>. GE. Pascal Fortran IV 12

Opérateurs logiques Pascal not, and, or Java !, &&, &, ||, | Ada not,

Opérateurs logiques Pascal not, and, or Java !, &&, &, ||, | Ada not, and then, or else, xor En générale, les opérations utilisent une évaluation paresseuse: elles arrêtent après le premier true pour "or", ou après le premier false pour "and". Les opérateurs &&, and then, ||, or else fonctionnent ainsi. 13

Assignation L’assignation fonctionne de la même manière dans tout les langages impératifs et orienté-objet.

Assignation L’assignation fonctionne de la même manière dans tout les langages impératifs et orienté-objet. Seul leur apparence est différente: target : = expression Algol, Pascal, Ada target = expression Fortran, C, Java target expression Smalltalk Il n’y a pas d’assignations en Prolog, ni en Scheme pure. 14

Assignation multiple Les assignations multiples sont plus intéressantes: PL/I: A, B : = EXPR;

Assignation multiple Les assignations multiples sont plus intéressantes: PL/I: A, B : = EXPR; Calcule la valeur de EXPR et la met dans A et puis dans B. Algol 60: A : = B : = EXPR; (1) évalue EXPR. (2) Assigne la valeur à B, puis A. ou (2) Assigne la valeur à A, puis B. 15

Multiple (2) L’ordre peut être important. Considérez: I : = 5; A[I] : =

Multiple (2) L’ordre peut être important. Considérez: I : = 5; A[I] : = I : = 10; L’ordre peut changer le résultat. Une méthode: (1) Trouver toute les adresses destination. (2) Trouver la valeur de EXPR. (3) Assigner cette valeur à A et B. Avec cette méthode, A[5] : = 10 et I : = 10. 16

(3) Une autre méthode: (1) Trouver la valeur de EXPR. (2) Trouver les adresses

(3) Une autre méthode: (1) Trouver la valeur de EXPR. (2) Trouver les adresses destinations et assigner la valeur aux adresses de gauche à droite. Selon cette méthode, encore A[5] : = 10. Une autre méthode: (1) Trouver la valeur de EXPR. (2) Trouver les adresses destinations et assigner la valeur aux adresses de droite à gauche. maintenant, A[10] : = 10. 17

Encore les assignations En C, cette expression n’est pas une assignation multiple: A =

Encore les assignations En C, cette expression n’est pas une assignation multiple: A = B = EXPR; Ici, B = EXPR a une valeur (la même valeur que EXPR). Cette valeur est ensuite assignée à A: l’opérateur d’assignation, en C, est associatif de droite à gauche. 18

More on 2) Une autre variation syntactique bien connue en C, C++, Java mélange

More on 2) Une autre variation syntactique bien connue en C, C++, Java mélange les assignations aux opérateurs arithmétiques. A += B; veut dire A = A + B; A *= B; veut dire A = A * B; Et ainsi de suite. Finalement, en C++ on peut avoir destinations conditionnelles, ce qui peut être difficile à suivre. (x != 0 ? y : z) = 17; ou (encore moins lisible) x ? y : z = 17; 19