180 likes | 270 Views
GEF 243B Programmation informatique appliquée. Expressions de type mixte et blocs §3.3 - 3.6 . Revue. Quel genre d’opérateur est sizeof() ? Quel est la valeur de toutes les variables pour les expressions suivantes? int a=5, b=3, c=4, d; d=++a%c-b--*b; float x=7.2, y=-3, z;
E N D
GEF 243BProgrammation informatique appliquée Expressions de type mixte et blocs §3.3 - 3.6
Revue • Quel genre d’opérateur est sizeof()? • Quel est la valeur de toutes les variables pour les expressions suivantes? • int a=5, b=3, c=4, d;d=++a%c-b--*b; • float x=7.2, y=-3, z; bool w;w = y>-x;z = x%y; JGA Beaulieu
Synopsis • Conversion de type • Implicite • Explicite • Énoncés • Énoncés composés (Blocs) JGA Beaulieu
Les Types Revisité • Un type définit • Un ensemble (plage) de valeurs • Un ensemble d’opérations • Pourquoi dit on que les opérateurs sont différents pour les types? • Ils font les mêmes opérations … non? JGA Beaulieu
Exemple d’addition • Faisons ces deux additions à la mitaine • Additionnez les int suivants • 125 + 375 • Additionnez les float suivants • 3.7525e2 + 7.525e-1 • Les int et float demande que l’on fasse l’addition de façon différente JGA Beaulieu
Exemple de multiplication • Faisons ces deux multiplication à la mitaine • Multipliez les int suivants • 125 * 375 • Aditionnez les float suivants • 3.7525e2 * 7.525e-1 • Les int et float demande que l’on fasse aussi la multiplication de façon différente JGA Beaulieu
Opérateurs et types • Il devient évident que + et * demandent que l’ordinateur exécute des opérations différentes dépendamment du type • Les autres opérateurs / - < > ++ … dépendent aussi du type • Mais qu’est-ce qui ce passe si on veut additionner un int avec un float? • x = 3.14159 + 1; JGA Beaulieu
Expressions de types mixtesConversion implicite • Que ce passe-t-il quand on veut multiplier un entier avec un nombre avec virgule flottante? • Dans un expression d’assignation, l’expression final doit avoir le même type que l’opérande de gauche • Mais avant d’arriver à l’assignation dans une expression complexe, C va faire une conversion implicite de type pour stocker les valeurs temporaires • C a une hiérarchie de promotion de type de façon à ne pas perdre de l’information durant la conversion JGA Beaulieu
Expressions de types mixtes JGA Beaulieu
Expressions de types mixtes - casting • Au lieu de laisser le compilateur décider, vous pouvez explicitement spécifier vos variables temporaires (cast) • Ceci est ce que nous devrions toujours faire pour s’assurer que les résultats sont ce que nous voulons. • Ex.: a, x et y sont int • (float) a //converti a à un float • (float) (x+y+3) //converti le résultat //de x+y+3 à float JGA Beaulieu
Expressions de types mixtes - casting • Mais il peut y avoir des problèmes en faisant du casting: float x,y; //mes vars de résultat int a; //une var int quelconque a = 3; // une valeur initiale x = (float) (a / 10); y = (float) a / 10; … • Est-ce que x et y ont la même valeur? JGA Beaulieu
Énoncés en C • Il y a différents types d’énoncés en C. • Le plus évident est l’énoncé d’expression. • Une expression peut être converti en énoncé en ajoutant un point-virgule à la fin de la ligne. x = a + 3; y = sizeof(int); • Un énoncé peut aussi être un appel de fonction. TransposeMatrix(matrixA); JGA Beaulieu
Énoncés en C C’é plate! JGA Beaulieu
Énoncés composés - blocs • Les blocs {} sont fait d’une section de déclaration (optionnelle) et un ensemble d’énoncés. • Les blocs peuvent être en dedans d’autre blocs (imbriqués). • La raison principale pour utiliser les blocs est pour créer des espaces de noms et pour allouer la mémoire plus efficacement. • Une variable déclarée dans un bloc est seulement visible dans ce bloc • Une fois que le bloc termine, la mémoire peut être réutilisé pour autres buts. • Nous allons voir bientôt que les énoncés for, while et do…while répètent seulement un énoncé • Donc nous allons utiliser les blocs pour grouper des énoncés en un énoncé composé JGA Beaulieu
Énoncés composées - blocs • Ex1.: blocs parallèles { //commence bloc A int k = 5; } //fini bloc A { //commence bloc B int i = 2; } //fini bloc B • Notez qu’il n’y a pas de point-virgule après l’accolade de fermeture, c’est déjà un énoncé JGA Beaulieu
Énoncés composées - blocs • Ex2.: blocs imbriqués { //commence bloc externe A int i = 2; int k = 5; //k est une variable dans le bloc A { //commence le bloc interne B int j; int k = 5; //Notez que k est une nouvelle variable!! j = k * 3; //k est celui interne (block B) k = i; //i peut être utilisé pcq il est visible } //fin du bloc interne B i = k; //quelle est la valeur de k ici? i = j – 6; //ERREUR j n’est pas visible ici } //fin du bloc externe A JGA Beaulieu
Problèmes de pratique • Tout comme les expressions, la conversion de type implicite et les erreurs possibles sont sujet à l’examen • Si x est float, y int et z char, quel est le type des expressions suivantes? • x /(y+z) ? • x * (double) y / z ? JGA Beaulieu
Revue • Les conversion de type implicite est fait par le compilateur dépendamment des types en jeu • L’assignation d’un type de haute précision à un type de plus basse précision peut engendrer une perte d’information • Les expressions composés ont des avantages: • Parfois la seule façon de faire • Organisation de la mémoire efficace • Masquage d’information (plus sur ce sujet en OO) • Rend le code plus facile à lire JGA Beaulieu