La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Expressions et assignations

Présentations similaires


Présentation au sujet: "Expressions et assignations"— Transcription de la présentation:

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

2 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.)

3 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)

4 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

5 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.

6 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 (!)

7 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!

8 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  integer, real  real

9 Surcharge (2) La surcharge peut toujours être résolu selon le contexte si tout le type de tout les opérandes est connu. Pour 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++.

10 La surcharge peut porter à confusion. En C:
(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. Et logique a :- b, c, d. Séparateur de parametres a(b, c, d) Séparateur d’une liste [b, c, d] un functor: (b, c, d) signifie , b c d

11 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.

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

13 Opérateurs logiques Pascal not, and, or Java !, &&, &, ||, |
Ada not, and, and then, or, 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.

14 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.

15 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.

16 L’ordre peut être important. Considérez: I := 5; A[I] := I := 10;
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.

17 (1) Trouver la valeur de EXPR.
(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. (2) Trouver les adresses destinations et assigner la valeur aux adresses de droite à gauche. maintenant, A[10] := 10.

18 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.

19 ou (encore moins lisible) x ? y : z = 17;
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 des destinations conditionnelles, ce qui peut être difficile à suivre. (x != 0 ? y : z) = 17; ou (encore moins lisible) x ? y : z = 17;


Télécharger ppt "Expressions et assignations"

Présentations similaires


Annonces Google