Exercices de programmation : Types, opérateurs et expressions en C.

Exercice 1

Eliminer les parenthèses superflues dans les expressions suivantes :

a= (x+5)  /* expression 1 */
a= (x=y)+2   /* expression 2 */
a= (x==y)   /* expression 3 */
(a a= (x+5)   /* expression 5 */

Solution :

  • a=x+5. /* expression 1*/ ; l’opérateur + est prioritaire sur l’opérateur d’affection =
  • a=(x=y) +2 /*expression 2*/; ici, l’opérateur + étant prioritaire sur =, les parenthèses sont indispensables.
  • a=x==y. /*expression 3*/; l’opérateur == est prioritaire sur =.
  • a<b&&c<d /*expression 4*/; l’opérateur && est prioritaire sur l’opérateur <.
  • i++ * (n+p) /*expression 5*/; l’opérateur ++ est prioritaire sur *; en revanche, * est prioritaire sur +; de sorte qu’on ne peut éliminer les dernières parenthèses.

Exercice 2

Soient les déclarations :
  char c = ‘x01’;
short int p = 10;

Quels sont le type et la valeur de chacune des expressions suivantes :
  p+3    /* 1 */
  c+1    /* 2 */
  p+c    /* 3 */
  3*p+5*c    /* 4*/

Solution :

  1. p est d’abord soumis à la convention “systématique” short→int, avant d’être ajouté à la valeur 3 (int). Le résultat 13 est de type int.
  2. est d’abord soumis à la conversion systématique char → int (ce qui aboutit à la valeur 1), avant d’être ajouté à la valeur 1(int). Le résultat 2 est de type 2 est int.
  3. est d’abord soumis à la conversion systématique short→ int,  tandis que  est soumis à la conversion systématique char → int; les résultats sont alors additionnés pour aboutir à la valeur 11 de type int.
  4. p etsont d’abord aux mêmes conversions systématiques que ci-dessus; le résultat 35 est de type int.

Exercice 3

Que soient les déclarations :
  char c = ‘\x05’;
  int n = 5;
  long p = 1000;
  float x = 1.25;
  double z = 5.5;

  n + c + p   /* 1 */
  2 * x +c   /* 2 */
  (char) n + c   /* 3 */
  (float) z + n/2   /* 4 */

Solution :

  1. c est tout d’abord converti en int, avant d’être ajouté à n. Le résultat (10), de type int, alos converti en long, avant d’être ajouté à p. On obtient finalement la valeur 1010, de type long.
  2. On value d’abord la valeur de 2*x. en convertissant 2 (int) en float, ce qui fournit la valeur 2.5 (de type float). Par ailleurs, c est converti en int (conversion systématique). On évalue ensuite la valeur de 2 *x, en convertissant 2 (int) en float, ce qui fournit la valeur 2.5 (de type float). Pour effectuer l’addition, on convertit alors la valeur entière 5(c), avant de l’ajouter au résultat précédent. On obtient finalement la valeur 7.75, de type float.
  3. n est tout d’abord converti en char (à cause de l’opérateur de « cast »), tandis que c est converti (conversion systématique) en int. Puis, pour procéder à l’addition, il est nécessaire de reconvertir la valeur de (char) n en int. Finalement, on obtient la valeur 10, de type int.
  4. z est d’abord converti en float, ce qui fournit la valeur 5.5 (approximative, car, en fait, on obtient une valeur un peu moins précise que ne le serait 5.5 exprimé en double). Par ailleurs on procède à la division entière de n par 2, ce qui fournit la valeur entière 2. Cette dernière est ensuite convertie en float, avant d’être ajoutée à 5.5, ce qui fournit le résultat 7.5. de type float.

Retour en haut