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; } |