28 votes

Qu'est-ce que l'évaluation des arguments ?

Herbert Schildt dit :

Dans certaines situations, une fonction réelle doit être utilisée à la place d'une macro-fonction, par exemple lorsque la taille du code doit être minimisée ou lorsqu'un argument ne doit pas être évalué plus d'une fois.

Que veut-il dire par "un argument ne doit pas être évalué plus d'une fois ?"

49voto

Joachim Pileborg Points 121221

Prenons une macro pour calculer le maximum de deux valeurs :

#define MAX(a, b) ((a) < (b) ? (a) : (b))

Alors on l'utilise comme ça :

int x = 5;
int y = 10;
int max = MAX(x++, y++);

Ensuite, la macro est étendue à

int max = ((x++) < (y++) ? (x++) : (y++));

Comme vous pouvez le voir, l'opération d'incrémentation sur l'un ou l'autre x ou y se produira deux fois Ce n'est pas ce qui se passerait si vous aviez une fonction où chaque argument que vous passez est évalué une seule fois.


Un autre point important est l'utilisation des parenthèses dans la macro. Prenons une autre macro simple :

#define MUL(a, b) a * b

Maintenant, si vous invoquez la macro comme

int sum = MUL(x + 3, y - 2);

alors l'expansion devient

int sum = x + 3 * y - 2;

Ce qui, en raison de la préséance des opérateurs est égal à

int sum = x + (3 * y) - 2;

Souvent, ce n'est pas tout à fait ce à quoi on s'attendait, si on s'y attend. (x + 3) * (y - 2) .

Ce problème est également "résolu" par l'utilisation de fonctions.

4voto

sun qingyao Points 1584

Parfois, les arguments ont effets secondaires .

Par exemple, la valeur de i++ est i mais i est augmentée de 1. En conséquence, la valeur de la variable suivante i++ sera i + 1 .

Dans une macro, les arguments sont évalués à chaque appel, ce qui entraîne des valeurs résultantes. Dans une fonction, les arguments (réels) sont évalués et copiés sur les arguments (formels) à l'intérieur de la fonction, ce qui élimine les effets secondaires.

Lorsque vous implémentez une fonction, vous ne vous souciez pas des effets secondaires. Cependant, la promotion de type implicite et le casting peuvent être source d'erreurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X