/* IFT1166 - démonstration #4 - exercice 6 02-octobre-2005 v1.00 M.Lokbani énoncé à partir Examen Intra 99. contact: lokbani@iro.umontreal.ca Cet exercice a pour but de vous montrer l'utilisation des macros et les fonctions inline. Copyright (C) 1999 - 2005 Université de Montréal Département d'informatique et de Recherche Opérationnelle M. Lokbani -- Tous Droits Réservés -- All Rights Reserved -- Pour compiler l'exercice dans son énoncé original, faire: g++ -Wall -pedantic -Os -DEXO_ORIG -c demo4exo6sol.cpp -o demo4exo6sol.o Pour compiler la version corrigée: g++ -Wall -pedantic -Os -c demo4exo6sol.cpp -o demo4exo6sol.o */ #ifdef EXO_ORIG #include #define MAX(a,b) ((a) > (b) ? (a) : (b)) using namespace std; int main () { int a =6,b=5,c=100; cout << "a: " << a << " b: " << b << " c: " << c << endl; /* Réponse : a: 6 b: 5 c: 100 */ c=MAX(a,b); cout << "a: " << a << " b: " << b << " c: " << c << endl; /* Réponse : a: 6 b: 5 c: 6 */ c=MAX(a++,b); cout << "a: " << a << " b: " << b << " c: " << c << endl; /* Réponse : a: 8 b: 5 c: 7 */ return 0; } /* Commentaires ------------ ((a) > (b) ? (a) : (b)) peut s'écrire ainsi si "a" supérieure à "b" alors retourne la valeur de "a" ; sinon (i.e. "a" est inférieure ou égale à "b") retourne la valeur de "b" Dans le cas de MAX(a++,b), cela se traduit comme suit: ((a++) > (b) ? (a++) : (b)) La variable "a" a été incrémentée à deux reprises. La première fois lors du test (>), la seconde fois parce que "a" est la valeur retournée ("a" étant supérieure à "b"). Si "b" valait 7, alors "b" sera retournée et "a" aura eu comme valeur (que) 7. A partir de ce dernier exemple, Nous aurions conclu que la macro fonctionne bien! Erreur! L'exercice est la pour le montrer. */ #else /* Question: --------- Réécrivez la définition de la fonction MAX grâce a une fonction qui offre la rapidité de la macro ci-dessus, mais sans les possibilités de calculs incorrects. Réponse : inline int MAX(int a,int b) { return(((a) > (b) ? (a) : (b))); } */ #include inline int MAX(int a,int b) { return(((a) > (b) ? (a) : (b))); } using namespace std; int main () { int a =6,b=5,c=100; c=MAX(a,b); cout << "a: " << a << " b: " << b << " c: " << c << endl; /* Réponse : a: 6 b: 5 c: 6 */ c=MAX(a++,b); cout << "a: " << a << " b: " << b << " c: " << c << endl; /* Réponse : a: 7 b: 5 c: 6 */ return 0; } /* Commentaires ------------ Voir les notes de cours, pour revoir le mécanisme de fonctionnement d'une fonction inline. */ #endif