Exercice langage C : Analyser des expressions

Analyser les expressions contenues dans le programme suivant :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include 
main()
{
  int a;
  int b;
  int c;

  a = 16;
  b = 2;
  c = 10;

  c += a > 0 && a <= 15 ? ++a : a/b;
  /*
   * Que dire de l'expression suivante ? :
   * -----------------------------------
   */
  a > 30 ? b = 11 : c = 100;
}

 




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include 
§MEVBCBfint main()
{
  int a;
  int b;
  int c;

  a = 16;
  b = 2;
  c = 10;

  /*
   * 1) on commence par évaluer l'expression
   *    a > 0 && a <= 15, laquelle constitue
   *    le 1er opérande de l'opérateur ?:.
   *    Celle-ci est fausse car les expressions
   *    a > 0 et a <= 15 sont vraie et
   *    fausse respectivement,
   * 2) on évalue donc le 3eme opérande de l'opérateur
   *    ?:, c'est-à-dire l'expression a/b,
   * 3) et enfin on effectue l'affectation.
   */
  c += a > 0 && a <= 15 ? ++a : a/b;
  printf( "c : %d\n", c );  ===>  18

  /*
   * Que dire de l'expression suivante? :
   * ----------------------------------
   */
  a > 30 ? b = 11 : c = 100;

  /*
   * Cette expression provoque une erreur
   * à la compilation car le troisième
   * opérande de l'opérateur ?: est c
   * et non pas c = 100. De ce fait,
   * l'expression a > 30 ? b = 11 : c
   * est d'abord évaluée. Sa valeur est ensuite utilisée
   * comme opérande de gauche de la dernière affectation.
   * D'où l'erreur, car cette valeur n'est pas une g-valeur.
   *
   * On devrait écrire :
   */

  a > 30 ? b = 11 : (c = 100);

  return 0;
}