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

CSI3525: Concepts des Langages de Programmation Notes # 9: Expressions et Affectations ( Lire Chapitre 6 )

Présentations similaires


Présentation au sujet: "CSI3525: Concepts des Langages de Programmation Notes # 9: Expressions et Affectations ( Lire Chapitre 6 )"— Transcription de la présentation:

1 CSI3525: Concepts des Langages de Programmation Notes # 9: Expressions et Affectations ( Lire Chapitre 6 )

2 2 Expressions Arithmetiques: Precedence des Operateurs La precedence (ou puissance) des operateurs est lordre devaluation dexpressions contennant plus dun operateurs [Lorsque des parentheses ne sont pas la pour determiner cet ordre explicitement]. Les operateurs sont groupes par types: Exposant: **. Operateurs unitaires: abs, + unitaire, - unitaire, ++, --, not. Operateurs multiplicatifs: *, /, div, mod, and. Operateurs additifs: + binaire, - binaire, or.

3 3 Ordre de Precedence dans Differents Langages Les regles de precedences peuvent etre differentes dun langage a lautre: Pascal: multiplicatifs > additifs C: unitaires > multiplicatifs > additifs Ada: exposants > multiplicatifs > unitaire +, - > additifs Fortran: ** > multiplicatifs > additifs APL: Tous les operateurs ont le meme niveau de precedence.

4 4 Expressions Arithmetique: Associativite Etant donne un operateur binaire,, on peut parle de: Associativite de gauche a droite: x y z = ( x y ) z Pascal, Ada, C (les operateurs normaux) Associativite de droite a gauche: x y z = x ( y z ) C (les operateurs de self-incrementation: ++, --) Non-Associativite: x y z est illegal: il faut specifier ou bien ( x y ) z ou alors x ( y z ) Ada (exposants): x ** y ** z est incorrect.

5 5 Expressions Arithmetique: Associativite (continue) Pas de Precedence, une regle dAssociativite: APL: toujours lassociativite de droite a gauche: x + y * z = x + ( y * z ) x * y + z = x * ( y + z ) Smalltalk: toujours lassociativite de gauche a droite x + y * z = ( x + y ) * z x * y + z = ( x * y ) + z

6 6 Expressions Arithmetique: Evaluation dArguments et Effets Secondaires Une fonction apparaissant dans une expression peut avoir des effets secondaires (un changement dans un objet non-local–ce qui veut dire que cet objet netait pas mentionne dans lexpression) Example: function twice (var x: real): real; begin x := x + x; twice := x end; Si on fait lappel: z := twice(y); la valeur de y est changee secretement. Lordre devaluation doperateurs est tres important dans le cas deffets secondaires

7 7 Expressions Arithmetique: Evaluation dArguments et Effets Secondaires (continue) Dans le programme suivant: y := 10; z := y + twice ( y ); Si le premier operande est evalue le premier, z aura la valeur30. Si, cependant, le deuxieme operande est evalue le premier, z aura la valeur 40. Le meme probleme arrive lorsque la valeur dune variable globale est change a linterieur dune fonction ou dune procedure.

8 8 Expressions Arithmetique: Evaluation dArguments et Effets Secondaires (continue) Solutions pour ce probleme: Interdiction deffets secondaires de fonctions: 1) Pas une bonne idee pour les langages qui nont pas de procedures, mais ont seulement des fonctions (C,C++). 2) De plus, il faudrait passer toutes les variables comme parametres Probleme defficacite: il est plus rapide davoir acces a des variables globales dans une fonction. Decider dun ordre devaluation doperandes: Pas une bonne ide car les methodes doptimization de compilateurs change parfois lordre devaluation des operandes

9 9 Expressions Arithmetique: Evaluation dArguments et Effets Secondaires (continue) Solutions pour ce probleme (continue): En Fortran 77: expressions qui ont des appels de fonctions sont legaux seulement si les fonctions ne changent pas les valeurs des autres operandes de lexpression probleme: il est tres difficile pour le compilateur de determiner leffet exact quune fonction peut avoir sur les variables contenues a lexterieur de cette fonction.

10 10 Expressions Arithmetiques: Operations Ternaires Expression conditionnelles: En Algol60: If x>0 then 1. else if x=0 then 0. else –1 En C, il y a loperateur: ? qui est un operateur ternaire : est un separateur: ( x > 0 ? 1 : ( x == 0 ? 0 : -1 ) )

11 11 Operateurs Overloades Un operateur est overloade si le meme nom ou le meme symbole a plusieurs usages distincts. Examples en Pascal: + addition dentier et de reels, concatenation de chaines de caracteres, union densembles. * multiplication dentiers et de reels, intersection densembles. abs entier entier, reel reel Il ny a pas doverloading pour mod et div

12 12 Operateurs Overloades (continue) Loverloading peut etre resolu en regardant le contexte (tous les operandes ont un type connu). Exemples: 2+3 entiers [a] + [c, d] ensembles Dans certains langages, comme lAda ou le C++ (qui sont des langages extensibles), le programmeur peut overloader lui/elle-meme des operateurs. En Ada, ou il ny a que 2 procedures de I/O: get, put, ces procedures sont tres overloades

13 13 Operateurs Overloades (continue) LOverloading peut porter a la confusion: En C, par exemple, & veut dire conjonction par bits et addresse. * veut dire multiplication et deference. En PL/1, par exemple, = veut dire egalite et affectation Cependant, loverloading est aussi tres utile car il peut rendre la lecture plus aisee.

14 14 Operateurs Overloades (continue) En Prolog, la virgule est tres overloadee, elle aussi: a :- b, c, d. and a(b, c, d) Separation darguments [b, c, d]. Separation delements de liste

15 15 Coercition de Types Les conversions de types sont ou bien aggrandiassantes ou retrecissantes. Il vaut toujours mieux aggrandir que retrecir: En Fortran, lordre de la coercition est: entier < reel < double < complex En Pascal, on a: entier < reel Neanmoins, il peut y avoir des problemes meme dans une conversion aggrandissante etant donnees les limites de la precision des types. Bien que la coercition soit bien pratique, la detection derreur de type est reduite.

16 16 Expressions Logiques Il existe six operateurs de comparaison: Pascal/Ada C Fortran Egal = ==.EQ. Inegal <>, /= !=.NE. Moins que < <.LT. Moins que ou Egal <= <=.LE. Plus que > >.LT. Plus que ou Egal >= >=.LE. Legalite est bien definie pour tous les types, mais il nexiste pas dordre naturel pour les types non scalaires.

17 17 Expressions Logiques (Continue) Lordre de precedence de tous les operateurs de lAda: **, abs, not *, /, mod, rem +, - (unitaire) +, - (binaire) =, /=,, =, in, not in and, or, xor, and then, or else Ce nest pas toujours comme cela: en Pascal, par exemple, les operateurs booleens ont une precedence plus haute que les operateurs relationnels a > 5 or a (5 or a) < 0

18 18 Expressions Logiques Evaluations Court-Circuites Une evaluation court-circuite est une evaluation dans laquelle le resultat est determine sans evaluer tous les operandes ou operateurs. Par exemple, dans lexpresion: (13 * A) * (B/13 –1), si A=0, on na pas besoin devaluer (B/13 –1). Neanmoins, dans les operations arithmetiques, il nest pas facile de detecter de telles situations. Ce court-circuit nest donc jamais utilise. Par contre, il peut etre utilise pour les operations logiques: Pascal ne lutilise pas du tout problemes; C lutilise tout le temps problemes; Ada permet les operations court-circuites et celles non court- circuites Meilleure approche.

19 19 Affectations Affectations simples: Resultat := Expression Resultat = Expression Resultat Expression Affectations Multiples: PL/1: A, B := Expression Algol 60: A := B := Expression 1. Il faut trouver la valeur de lExpression 2. Il faut affecter cette valeur a A puis a B 2.Il faut affecter cette valeur a B uis a A Lordre daffectation est important et lordre dans lequel les addresses des resultats sont evaluees est aussi important.

20 20 Affectations (Continue) Affectation Composee (en C): a += b; a = a +b; a *= b; a = a * b; etc… Affectations Conditionnelles (en C): (x != 0 ? Y : z) = 17 ou bien x ? Y : z = 17; Affectation qui est une expression (en C): a = b = Expression; b=Expression a une valeur (Expression qui est affectee a a) while ((ch=getchar()) != EOF) { … }


Télécharger ppt "CSI3525: Concepts des Langages de Programmation Notes # 9: Expressions et Affectations ( Lire Chapitre 6 )"

Présentations similaires


Annonces Google